5

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

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

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

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

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

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

2 回答 2

2

通常我会执行以下操作:

1 - 创建一个引导程序类

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 中的引导方法:

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

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

另请注意,我已向GetInstance<T>引导程序类添加了一个方法。这种方法使得通过请求类型的实例直接使用容器成为可能。我已经添加了这个方法,所以你知道它是可能的,但如果可能的话,总是使用构造函数注入

于 2016-03-21T14:33:50.500 回答
1

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

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

于 2016-03-21T19:24:02.650 回答