繁体   English   中英

Web应用程序中的Autofac,我应该在哪里存储容器以便于访问?

[英]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对象),那么您可以:

  1. 使用手工编码的工厂(工厂注入组件,组件使用工厂创建其他对象)
  2. 在Autofac 2中使用Autofac 委托工厂新的自动生成工厂

Peter Lillevold上面的回答是正确的 - 您可以通过依赖IContext接口从任何组件访问容器。

如果确实需要实际的容器引用,请参阅Autofac.Integration.Web.IContainerProviderAccessor。

通常的做法是将容器存储在Global app类的静态变量中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM