我仍然是使用Autofac的新手,我在文档和示例中遗漏的一件事是如何使从Web应用程序中的不同位置轻松访问配置的容器.
我知道我可以使用Autofac控制器工厂自动解决构造函数注入控制器的依赖关系,但是你可能需要解决的其他东西如何还没有注入.
是否有一个我不知道的明显模式?
谢谢!
Autofac"方式"是具有IContext
构造函数参数.Autofac将注入一个可用于解析类型的对象.
上下文通常是幕后的容器,IContainer
实现IContext
接口,但IContext
仅限于做解析.
我知道容器不应该"过度使用",但作为OP,我有需要解析未提前知道的类型的类(因此不能用作构造函数参数).我发现在这些情况下,将容器视为可用于解析其他服务的另一个服务,并像其他任何服务一样注入它.
如果您认为使用IContext将您绑定到Autofac并且需要使用您自己的接口对其进行抽象,则只需IContext
在容器中注册包装类即可.
更新:在Autofac 2中,IContext
调用IComponentContext
.
首先尽量不要过度使用IoC容器.它非常适合"连接"控制器,视图和服务,但是需要在运行时创建的对象应该由工厂对象而不是容器创建.否则,您将通过代码调用Container.Resolve,将其绑定到容器中.这些额外的依赖性破坏了使用IoC的目的.在大多数情况下,我只能在应用程序的顶层解析一个或两个依赖项.然后,IoC容器将递归地解析大多数依赖项.
当我在我的程序中的其他地方需要容器时,这是我经常使用的技巧.
public class Container : IContainer { readonly IWindsorContainer container; public Container() { // Initialize container container = new WindsorContainer(new XmlInterpreter(new FileResource("castle.xml"))); // Register yourself container.Kernel.AddComponentInstance(this); } public T Resolve () { return container.Resolve (); } }
我将容器包装在像这样的Container类中.它将自己添加到构造函数中的包装容器中.现在需要容器的类可以注入IContainer.(该示例适用于Castle Windsor,但它可能适用于AutoFac)
在全球范围内提供IOC容器不是最佳做法.甚至不鼓励通过集装箱.
如果无法使用依赖注入(您需要在创建组件后创建\ request对象),那么您可以:
使用手工编码的工厂(工厂注入组件,组件使用工厂创建其他对象)
在Autofac 2中使用Autofac 委托工厂或新的自动生成工厂.
Peter Lillevold上面的回答是正确的 - 您可以通过依赖IContext接口从任何组件访问容器.
如果确实需要实际的容器引用,请参阅Autofac.Integration.Web.IContainerProviderAccessor.