为什么Structuremap的Transient生命周期在嵌套容器上被视为ContainerScoped?

时间:2017-11-17 17:21:32

标签: c# ioc-container structuremap transient

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

    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但isBothNestedInstancesSame为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)为什么我不应该希望嵌套容器每次都返回一个新实例?

由于

1 个答案:

答案 0 :(得分:1)

我能给出的最佳答案是 nested 一词指的是容器的服务,而不一定是指容器的层次结构(这就是为什么child containers也存在的原因) 从普通容器获取服务实例将创建一个带有完整对象图的新实例,其中包含所有必需的嵌套服务。在对象图内嵌套一些瞬态服务的时间没有多大关系,只为该服务类型创建一个实例并在整个图中重新使用。

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

也许此示例将有助于嵌套容器http://structuremap.github.io/the-container/nested-containers/#sec5

的使用

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

要使嵌套容器在每次应将服务注册为AlwaysUnique

时返回一个新实例。