在哪里放置容器?

5

我正在尝试在Web应用程序中使用IoC,希望按照最佳实践进行操作。最近我发现了一个名为DryIoc的IoC框架,它应该很小且速度快。

我已经阅读了示例,但没有哪个示例指出我应该将容器放在哪里。

它应该放在控制器中吗?还是在Global.asax中?还是其他地方?或者作为类中的静态变量?

如果有人能够引导我走向正确的方向,最好附上一些示例代码,因为我已经停滞不前,不知道如何继续下去。

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

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

2
你需要在组合根中使用容器。 - Yacoub Massad
1
我建议您使用更广泛使用的容器来开始使用 DI,因为您会发现有更多的支持、示例和工具。如果在使用其他容器后,您决定尝试这些小型、不常用的容器,那么您将有足够的经验来知道如何正确地使用它们。 - Erik Funkenbusch
2
与其他评论和答案不同,我建议您根本不使用DI容器。这将有益于您更好地学习底层模式,并且您不会被某些尴尬的API问题所困扰。 - Mark Seemann
2
@MarkSeemann 真的吗?与您的评论相反,我建议我们全部返回到汇编语言....................... - Matías Fidemraizer
1
请注意,许多IOC项目已经为您提供了这种支持:https://www.nuget.org/packages/StructureMap.MVC5/,尽管如果您使用StructureMap4,则需要调整MVC5包在解决方案中放置的2个文件 https://github.com/webadvanced/Structuremap.MVC5/issues/15 - Chris Marisic
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 - 在global.asax文件中的Application_Start方法中调用bootstrap方法:

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

永远不要直接在任何地方使用容器,您必须在MVC生命周期的某个地方挂钩它,通常您使用的DI包可以为您完成此操作。

还要注意,我已经向启动程序类添加了一个GetInstance<T>方法。这个方法使得直接请求类型实例时可以使用容器。我添加了这个方法,以便您知道它是可能的,但如果可能的话,请始终使用构造函数注入。


Maartn,你能否删除GetInstance方法?大多数新手会使用它并从那里解决问题。此外,您可以添加一个返回新生命周期范围的方法。 - Erkan Demirel
2
我会按照这种方式做,但我会利用WebActivator,而不是强制污染全局asax。 - Chris Marisic

1

实际上,您可能不需要在您这一侧存储容器。这里是DryIoc WebApi Owin示例

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接