使用Autofac作为服务定位器

我正在使用Autofac来处理我的应用程序中的dependency injection。 但是,我有一个组件在运行时执行一些reflection魔法,我不知道它在编译时需要什么依赖项。

通常,我只是让这个组件直接引用Container并解决它想要的任何东西。 但是,实例化此类的类没有对Container的引用。

实际上,我的组件依赖于Autofac。 我更喜欢松散耦合,但这似乎不是一个选择。 有没有办法要求(在构造函数args中,或使用属性注入,或者其他什么!)Autofac给我一个对我的构造函数中的容器的引用? 或者,是否有更简洁的方法让Autofac为我提供可以解决任何问题的魔术服务定位器对象?

是的你可以。 只需依赖IComponentContext

 public class MyComponent { IComponentContext _context; public MyComponent(IComponentContext context) { _context = context; } public void DoStuff() { var service = _context.Resolve(...); } } 

从注释更新:注入MyComponentIComponentContext取决于MyComponent解析范围。 因此,重要的是要考虑MyComponent生命周期范围。 例如,使用InstancePerLifetimeScope ,上下文将始终解析为依赖于MyComponent的服务所在的相同范围。

假设你有两个组件,A和B.

如果A在使用之前需要知道关于B的X,那么这就是元数据询问,并且在这篇优秀的文章中有描述。

此外,即使您无法使您的设计适应该post,您也应该再次尝试确保是否确实需要将DI容器用作服务定位器。

在撰写本文时,我能找到的最好的博客文章就是这篇文章 。

在其他情况下,如果未使用DI创建组件,则仍可以使用服务定位器模式。 CodePlex上的Common Service Locator库非常适合此目的。