![](/img/trans.png)
[英]Why should I use IoC Container (Autofac, Ninject, Unity etc) for Dependency Injection in ASP.Net Applications?
[英]Autofac in web applications, where should I store the container for easy access?
我仍然是使用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<IContainer>(this);
}
public T Resolve<T>()
{
return container.Resolve<T>();
}
}
我将容器包装在像这样的Container类中。 它将自己添加到构造函数中的包装容器中。 现在需要容器的类可以注入IContainer。 (该示例适用于Castle Windsor,但它可能适用于AutoFac)
在全球范围内提供IOC容器不是最佳做法。 甚至不鼓励通过集装箱 。
如果无法使用依赖注入(您需要在创建组件后创建\\ request对象),那么您可以:
Peter Lillevold上面的回答是正确的 - 您可以通过依赖IContext接口从任何组件访问容器。
如果确实需要实际的容器引用,请参阅Autofac.Integration.Web.IContainerProviderAccessor。
通常的做法是将容器存储在Global app类的静态变量中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.