我对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:
也许我对自己的想法还不够清楚。我试图对我想要实现的结构做一个图片:
每个字母代表相应类的已解析实例。箭头显示了这些实例应注入的位置。如您所见,每次我在根实例中解析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中是否有类似的东西?