我目前正在使用 Autofac,但也愿意对其他 IOC 容器发表评论。如果可能的话,我更喜欢使用 Autofac 的解决方案。我对 IOC 也有些陌生,所以我可能会严重误解我应该使用 IOC 容器做什么。
基本上,情况如下:
我的应用程序有一个最顶层的 IOC 容器。我有一个子容器/范围树,我希望相同的“服务”(IWhatever)根据树中的哪个级别解决不同的问题。此外,如果服务未在树中的某个级别注册,我希望树向上横向直到找到合适的实现。
此外,在构建给定组件时,我很可能需要访问父容器/范围。在许多情况下,我正在注册的组件将依赖于父作用域中的相同或不同服务。
有没有办法用 Autofac 表达这种依赖关系?就像是:
builder.Register(c=>
{
var parentComponent = ?.Resolve<ISomeService>();
var childComponent = new ConcreteService(parentComponent, args...);
return childComponent;
}).As<ISomeService>();
由于以下几个原因,我无法获得类似于上述伪代码的任何东西:
A)似乎范围树中的所有级别都共享一组共同的注册。我似乎无法找到将给定注册限制在某个“范围”的方法。
B)我似乎无法找到一种方法来获取给定范围的父范围。我可以在容器中解析 ILifetimeScope,然后将其转换为提供其父范围的具体 LifetimeScope 实例,但我猜它可能是要以这种方式使用的注释。这安全吗?
C)我不确定如何告诉 Autofac 哪个容器拥有已解析的对象。对于许多组件,我希望组件由其构建的范围“拥有”。标记的上下文可以在这里帮助我吗?我必须用唯一的标签标记树的每一层吗?这会很困难,因为树的深度是在运行时确定的。
很抱歉这个非常冗长的问题。总之:
1) 有什么方法可以使用 Autofac 做我想做的事吗?
2)是否有另一个容器更适合这种依赖结构?
3)国际奥委会是完全错误的工具吗?