围绕已解决实例的autofac范围

时间:2018-08-06 15:21:41

标签: dependency-injection ninject autofac ioc-container

我对autofac有点陌生,但是已经成功地将其与其他“简单”配置一起使用了。现在,我正在尝试更复杂的方法,并为此做出了努力。

从本质上讲,我有一个入口点,所有autofac配置都已完成,第一个对象已解析,它们本身通过构造函数注入获得依赖关系,它们的依赖关系可以具有其他依赖关系,依此类推。

某些代码:

public class Root
{
    public Root(A.Factory factory)
    {
        for (int i = 0; i < 3;i++)
        {
            A obj = factory();
            // do something here
        }
    }
}

public class A
{
    public delegate A Factory();

    public A(B b, C c)
    {
    }
}

public class B
{
    public B(C c)
    {
    }
}

public class C
{
}

我想要的是: 类根仅解析一次。 A类应每次都作为新实例进行解析。 对于每个A及其子对象,应共享B和C的实例。 即:在每个A的“内部”,每个B和C只有一个实例。但是每个A都有自己的B和C实例。

我认为我可以使用Owned进行此操作(尚未尝试)。无论如何,我想将所有特定于autofac的代码都排除在我的业务类别之外,所以我认为也许有一种方法可以告诉注册每次A解析时它都应该创建一个新范围。

autofac有可能吗?我有奇怪的要求还是我的想法走错了路?除了autofac以外的其他DI框架,这是否有可能?

最诚挚的问候,

Kc

更新2018-08-07:

也许我对自己的想法还不够清楚。我试图对我想要实现的结构做一个图片:

Instance graph

每个字母代表相应类的已解析实例。箭头显示了这些实例应注入的位置。如您所见,每次我在根实例中解析A的实例时,都会创建B和C的新实例。但是,应该将C的相同实例注入到这些新的A和B实例中。无论如何,这不应该仅限于两个类别,因此应尽量减少手动接线。

您可以将A想象成是后续所有依赖项的范围生成器。

同时,我发现Ninject有一个命名范围的扩展名(Ninject.Extensions.NamedScope),它允许这种事情。配置将是这样的:

Bind<A>.ToSelf().DefinesNamedScope("ScopeA");
Bind<B>.ToSelf().InNamedScope("ScopeA");
Bind<C>.ToSelf().InNamedScope("ScopeA");

autofac中是否有类似的东西?

0 个答案:

没有答案