我正在使用Autofac来处理我的应用程序中的依赖注入。但是,我有一个组件在运行时执行一些反射魔法,我不知道它在编译时需要哪些依赖项。
通常,我只是让这个组件直接引用Container并解决它想要的任何问题。但是,实例化此类的类没有对Container的引用。
实际上,我的组件依赖于Autofac。我更喜欢松散耦合,但这似乎不是一个选择。有没有办法问(在构造函数args中,或使用属性注入,或其他什么!)Autofac给我一个对我的构造函数中的容器的引用?或者,是否有更简洁的方法让Autofac为我提供可以解决任何问题的魔术服务定位器对象?
答案 0 :(得分:12)
是的,你可以。只需依赖IComponentContext
:
public class MyComponent
{
IComponentContext _context;
public MyComponent(IComponentContext context)
{
_context = context;
}
public void DoStuff()
{
var service = _context.Resolve(...);
}
}
从评论中更新:注入IComponentContext
的{{1}}取决于MyComponent
已解决的范围。因此,重要的是要考虑注册的生命范围MyComponent
。例如。使用MyComponent
,上下文将始终解析为服务取决于InstancePerLifetimeScope
的相同范围。
答案 1 :(得分:1)
假设您有两个组件,A和B.
如果A在使用之前需要知道关于B的X,那么这就是元数据询问,并在excellent帖子中进行了描述。
此外,即使您无法使设计适应该帖子,您也应该再次尝试确保是否确实需要将DI容器用作服务定位器。
在撰写本文时,我能找到的最好的博客文章是this一篇。
答案 2 :(得分:0)
在其他情况下,如果未使用DI创建组件,则仍可以使用服务定位器模式。 CodePlex上的公共服务定位器库非常适合此目的。