【问题标题】:Why is Structuremap's Transient lifecycle treated like ContainerScoped on nested containers?为什么在嵌套容器上将 Structuremap 的瞬态生命周期视为 ContainerScoped?
【发布时间】:2018-05-01 13:16:14
【问题描述】:

我有以下类声明和单元测试:

    public class Blah { }

    [TestMethod]
    public void TestMethod1()
    {
        var container = new Container();

        var instance1 = container.GetInstance<Blah>();
        var instance2 = container.GetInstance<Blah>();

        var areBothInstancesSame = instance1 == instance2;

        var nested = container.GetNestedContainer();

        var nestedInstance1 = nested.GetInstance<Blah>();
        var nestedInstance2 = nested.GetInstance<Blah>();

        var areBothNestedInstancesSame = nestedInstance1 == nestedInstance2;
    }

当我运行此测试时,areBothInstancesSame 为 false,但 areBothNestedInstancesSame 为 true。

我还在 Web Api 控制器操作中对此进行了测试:

    public class Blah { }

    public IHttpActionResult GetBlah()
    {
        var scope = this.Request.GetDependencyScope();

        var instance1 = (Blah)scope.GetService(typeof(Blah));
        var instance2 = (Blah)scope.GetService(typeof(Blah));

        var areBothInstancesSame = instance1 == instance2;

        return this.Ok();
    }

再一次,areBothInstancesSame 是真的。

我在 Structuremap 的文档中看到了这一点,所以我相信它按预期工作,但我不明白为什么要这样做或如何获取 Web Api 自动创建的嵌套容器,以便为每个服务返回一个新实例瞬态生命周期。

谁能帮我理解:1)为什么这是预期的默认行为以及如何使嵌套容器每次都返回一个新实例;或 2) 为什么我不希望嵌套容器每次都返回一个新实例是显而易见的?

谢谢

【问题讨论】:

  • 所以,我看到 AlwaysUnique 是导致嵌套容器返回唯一实例的生命周期。我仍然不明白将默认设置为 ContainerScoped 的原因。
  • 我在将 StructureMap.Microsoft.DependencyInjection 库用于 asp.net core 2.0 时看到了相同的行为。您是否能够理清为什么瞬态和容器作用域的行为相同?
  • 我不是,但行为是一致的,它符合我们真正想要的行为,所以我没有花太多时间在它上面。

标签: c# ioc-container structuremap transient


【解决方案1】:

我能给出的最佳答案是,nested 这个词指的是容器的服务,而不是看起来的容器层次结构(这就是为什么child containers 也存在的原因) 从普通容器获取服务实例将创建一个新实例以及完整的对象图,其中包含所有必需的嵌套服务。无论某些瞬态服务嵌套在对象图中多少次,都只会为该服务类型创建一个实例并在整个图中重复使用。

对于嵌套容器,瞬态实例的行为与它们属于(嵌套在内部)同一个对象图一样,因为它的目的是在一个逻辑请求中使用。

也许这个例子将有助于使用嵌套容器http://structuremap.github.io/the-container/nested-containers/#sec5

基本上存在嵌套容器以确保瞬态服务不会在每次 GetService 调用时获得新实例。

要让嵌套容器在每次注册服务时返回一个新实例AlwaysUnique

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    相关资源
    最近更新 更多