解决IContainer


70

从应用程序的类内部获取Autofac容器的建议方法是什么?Autofac是否提供解析类上的IContainer属性的权限,或者在构建容器后是否需要全局存储容器?

Answers:


109

您将需要IComponentContextILifetimeScope出于大多数目的。这些是由Autofac自动提供的,因此您需要做的就是对其中一个添加一个(构造函数)依赖项,并且当前实例将被注入。

这两个接口均提供标准Resolve()操作,同时通过添加用于启动新的嵌套生命周期的方法进行ILifetimeScope扩展IComponentContext

想要使用容器的服务来访问其他组件的组件需要在自己的范围内进行操作,而不是在'global'范围内进行操作IContainer,以便可以返回正确的实例。例如,在HTTP请求中,注入的IComponentContextILifetimeScope将是当前请求的。

使用关系类型也可以(通常更优雅地)克服大多数需要注入上下文的问题-请参阅:http : //autofac.readthedocs.org/en/latest/resolve/relationships.html


1
最好注意,自动装配该类与使用委托创建它之间有区别。在我的情况,下面的工作:builder.RegisterType<QueryProcessor>()虽然下面的失败,在运行时的ObjectDisposedException一旦IComponentContext被称为:builder.Register(c => new QueryProcessor(c))
史蒂文2014年

10
builder.Register(c => new QueryProcessor(c))需要是:builder.Register(c => new QueryProcessor(c.Resolve<IComponentContext>()))-c是一个临时性的,可以根据每次操作生存。HTH!
Nicholas Blumhardt 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.