当前位置:  开发笔记 > 后端 > 正文

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

如何解决《Web应用程序中的Autofac,我应该在哪里存储容器以便于访问?》经验,为你挑选了4个好方法。

我仍然是使用Autofac的新手,我在文档和示例中遗漏的一件事是如何使从Web应用程序中的不同位置轻松访问配置的容器.

我知道我可以使用Autofac控制器工厂自动解决构造函数注入控制器的依赖关系,但是你可能需要解决的其他东西如何还没有注入.

是否有一个我不知道的明显模式?

谢谢!



1> Peter Lillev..:

Autofac"方式"是具有IContext构造函数参数.Autofac将注入一个可用于解析类型的对象.

上下文通常是幕后的容器,IContainer实现IContext接口,但IContext仅限于做解析.

我知道容器不应该"过度使用",但作为OP,我有需要解析未提前知道的类型的类(因此不能用作构造函数参数).我发现在这些情况下,将容器视为可用于解析其他服务的另一个服务,并像其他任何服务一样注入它.

如果您认为使用IContext将您绑定到Autofac并且需要使用您自己的接口对其进行抽象,则只需IContext在容器中注册包装类即可.

更新:在Autofac 2中,IContext调用IComponentContext.



2> Mendelt..:

首先尽量不要过度使用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)



3> andrey.tsyku..:

在全球范围内提供IOC容器不是最佳做法.甚至不鼓励通过集装箱.

如果无法使用依赖注入(您需要在创建组件后创建\ request对象),那么您可以:

    使用手工编码的工厂(工厂注入组件,组件使用工厂创建其他对象)

    在Autofac 2中使用Autofac 委托工厂或新的自动生成工厂.



4> Nicholas Blu..:

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

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

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有