使用Autofac作为服务定位器
本文关键字:服务 定位器 Autofac 使用 | 更新日期: 2023-09-27 18:06:33
我使用autofacc来处理我的应用程序中的依赖注入。然而,我有一个组件在运行时做一些反射魔法,我不知道在编译时它需要什么依赖项。
通常,我只会让这个组件直接引用容器并解析它想要的任何内容。但是,实例化该类的类没有对容器的引用。
实际上,我的组件依赖于Autofac。我更喜欢松散的耦合,但在这里似乎没有这个选项。是否有一种方法来询问(在构造函数参数中,或使用属性注入,或其他!)autofacc给我一个引用的容器在我的构造函数?或者,是否有一种更简洁的方式,让Autofac为我提供一个可以解析任何东西的神奇服务定位器对象?
可以。只需要依赖于IComponentContext
:
public class MyComponent
{
IComponentContext _context;
public MyComponent(IComponentContext context)
{
_context = context;
}
public void DoStuff()
{
var service = _context.Resolve(...);
}
}
注释更新:注入MyComponent
的IComponentContext
取决于MyComponent
被解析的范围。因此,考虑用什么生命周期范围注册MyComponent
是很重要的。例如,使用InstancePerLifetimeScope
,上下文将始终解析到依赖于MyComponent
的服务所在的相同范围。
假设你有两个组件,A和b
如果A在使用它之前需要知道关于B的X,这是元数据询问,在这篇优秀的文章中有描述。
此外,即使你不能使你的设计适应那篇文章,你也应该再次尝试确保你是否真的需要使用你的DI容器作为服务定位器。
在写这篇文章的时候,我能找到的描述它的最好的博客是这篇。
在其他情况下,当您的组件不是通过使用DI创建时,您仍然可以使用服务定位器模式。CodePlex上的公共服务定位器库非常适合这个目的。