使用Autofac作为服务定位器

本文关键字:服务 定位器 Autofac 使用 | 更新日期: 2023-09-27 18:06:33

我使用autofacc来处理我的应用程序中的依赖注入。然而,我有一个组件在运行时做一些反射魔法,我不知道在编译时它需要什么依赖项。

通常,我只会让这个组件直接引用容器并解析它想要的任何内容。但是,实例化该类的类没有对容器的引用。

实际上,我的组件依赖于Autofac。我更喜欢松散的耦合,但在这里似乎没有这个选项。是否有一种方法来询问(在构造函数参数中,或使用属性注入,或其他!)autofacc给我一个引用的容器在我的构造函数?或者,是否有一种更简洁的方式,让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,这是元数据询问,在这篇优秀的文章中有描述。

此外,即使你不能使你的设计适应那篇文章,你也应该再次尝试确保你是否真的需要使用你的DI容器作为服务定位器。

在写这篇文章的时候,我能找到的描述它的最好的博客是这篇。

在其他情况下,当您的组件不是通过使用DI创建时,您仍然可以使用服务定位器模式。CodePlex上的公共服务定位器库非常适合这个目的。