2

我目前正在使用 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)国际奥委会是完全错误的工具吗?

4

1 回答 1

2

Autofac 1.4 很容易支持这一点,并且可能是目前最好的选择。您可以简单地在子容器中注册子容器组件。

您正在使用的 Autofac 2 还没有一个简单的等价物,尽管它正在研究中。

于 2010-01-08T22:19:12.253 回答