容器放在哪里?

时间:2016-03-21 14:30:14

标签: c# .net asp.net-mvc inversion-of-control dryioc

我正在我的Web应用程序中尝试IoC,并希望根据最佳实践做事。最近我发现了一个名为DryIoc的IoC框架,它应该是小而快的。

我已经阅读了这些示例,但似乎没有人指出我应该把容器放在哪里。

它应该驻留在控制器中吗?还是在Global.asax?别的地方可能吗?或者可能作为类中的静态变量?

我很感激,如果有人能够指导我朝着正确的方向前进,最好还是使用一些示例代码,因为我已经停滞不前,并且不知道如何继续。

var container = new Container();   // Should obviously NOT be a local variable

container.Register<ISalesAgentRepository, SalesAgentRepository>(Reuse.Singleton);

2 个答案:

答案 0 :(得分:2)

通常我会做以下事情:

1 - 创建一个bootstrapper类

public static class Bootstrapper {
    public static Container _container;
    public void Bootstrap() {
        var container = new Container;
        // TODO: Register all types
        _container = container;
    }
    public static T GetInstance<T>() {
        return _container.Resolve<T>();
    }
}

2 - 在Application_Start方法中调用global.asax中的bootstrap方法:

protected void Application_Start() {
    Bootstrapper.Bootstrap();
}

永远不要直接在任何地方使用容器,你必须在MVC生命周期的某个地方挂钩,通常你使用的DI包可以为你做这个。

另请注意,我已经在bootstrapper类中添加了GetInstance<T>方法。此方法可以通过请求类型实例直接使用容器。我已经添加了这个方法,因此您知道它是可能的,但是如果可能的话总是使用构造函数注入

答案 1 :(得分:1)

实际上,您可能不需要将容器存放在您身边。这是DryIoc WebApi Owin sample

DryIoc.WebApi扩展将在IDependencyResolver实现中适当时存储和处置容器。