使用Autofac作为服务定位器

Dav*_*fer 15 c# dependency-injection inversion-of-control autofac

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

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

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

Pet*_*old 13

是的你可以.只需依赖于IComponentContext:

public class MyComponent
{
    IComponentContext _context;
    public MyComponent(IComponentContext context)
    {
        _context = context;
    }

    public void DoStuff()
    {
        var service = _context.Resolve(...);
    }
}
Run Code Online (Sandbox Code Playgroud)

从评论中更新:IComponentContext注入的内容MyComponent取决于MyComponent解决的范围.因此,重要的是要考虑MyComponent注册的寿命范围.例如,使用时InstancePerLifetimeScope,上下文将始终解析为服务取决于MyComponent生命的相同范围.

  • 它将解析`MyComponent`被解析的范围内的`IComponentContext`.因此,如果`MyComponent`注册为`InstancePerLifetimeScope`,`context`将始终从预期范围解析. (3认同)