从应用程序的类内部获取Autofac容器的建议方法是什么?Autofac是否提供解析类上的IContainer属性的权限,或者在构建容器后是否需要全局存储容器?
Answers:
您将需要IComponentContext
或ILifetimeScope
出于大多数目的。这些是由Autofac自动提供的,因此您需要做的就是对其中一个添加一个(构造函数)依赖项,并且当前实例将被注入。
这两个接口均提供标准Resolve()
操作,同时通过添加用于启动新的嵌套生命周期的方法进行ILifetimeScope
扩展IComponentContext
。
想要使用容器的服务来访问其他组件的组件需要在自己的范围内进行操作,而不是在'global'范围内进行操作IContainer
,以便可以返回正确的实例。例如,在HTTP请求中,注入的IComponentContext
或ILifetimeScope
将是当前请求的。
使用关系类型也可以(通常更优雅地)克服大多数需要注入上下文的问题-请参阅:http : //autofac.readthedocs.org/en/latest/resolve/relationships.html。
builder.Register(c => new QueryProcessor(c))
需要是:builder.Register(c => new QueryProcessor(c.Resolve<IComponentContext>()))
-c
是一个临时性的,可以根据每次操作生存。HTH!
builder.RegisterType<QueryProcessor>()
虽然下面的失败,在运行时的ObjectDisposedException一旦IComponentContext
被称为:builder.Register(c => new QueryProcessor(c))
。