我目前正在使用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) IOC是不是完全错误的工具?
发布于 2010-01-09 06:19:12
Autofac 1.4很容易支持这一点,可能是现在最好的选择。您可以简单地在子容器中注册子容器组件。
您正在使用的Autofac 2还没有一个简单的等价物,尽管它正在研究中。
https://stackoverflow.com/questions/2028726
复制相似问题