2011-01-05 29 views
56

在应用程序中从类内部获取Autofac容器的建议方法是什么? Autofac是否提供了解决某个类的IContainer属性的问题,或者我是否需要在构建它时全局存储容器?解决IContainer

回答

88

对于大多数目的,您需要IComponentContextILifetimeScope。这些由Autofac自动提供,因此您只需对其中一个进行(构造函数)依赖,并将当前实例注入。

两个接口都提供标准的Resolve()操作,而ILifetimeScope通过添加启动新的嵌套生命期的方法来扩展IComponentContext

想要使用容器服务访问其他组件的组件需要在其自己的作用域内执行,而不是'全局'​​,以便可以返回正确的实例。例如。在HTTP请求中,注入的IComponentContextILifetimeScope将成为当前请求的一个。

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

+1

最好能够注意到,自动布线类和使用委托创建它之间存在差异。在我的情况下,以下工作:'builder.RegisterType ()',一旦调用了'IComponentContext',以下的失败与一个ObjectDisposedException:'builder.Register(c => new QueryProcessor(c))' 。 – Steven 2014-09-04 08:20:13

+9

'builder.Register(c => new QueryProcessor(c))''需要:'builder.Register(c =>新的QueryProcessor(c.Resolve ()))' - 'c'是临时的以每个操作为基础生活。 HTH! – 2014-09-05 01:27:05