Dependency injection 如何为ASP.NETMVC项目创建启动程序项目

Dependency injection 如何为ASP.NETMVC项目创建启动程序项目,dependency-injection,ioc-container,simple-injector,bootstrapper,onion-architecture,Dependency Injection,Ioc Container,Simple Injector,Bootstrapper,Onion Architecture,我是IoC、依赖注入和洋葱架构的新手。我正试图根据洋葱架构社区的指导方针和最佳实践来创建我的解决方案架构。 在我的VS解决方案中,我有一些用于域核心的项目,一些用于基础设施,还有一个用于用户界面的ASP.NET MVC。现在我想向解决方案添加一个IoC容器。我知道最佳实践是添加一个引导程序或启动器项目,该项目引用了IoC容器(在我的例子中是简单的注入器)和解决方案中的所有项目。通过这种方式,我可以将整个解决方案从IoC容器中分离出来,并且我可以在将来轻松地将其替换为其他解决方案。现在我的问题是:

我是IoC、依赖注入和洋葱架构的新手。我正试图根据洋葱架构社区的指导方针和最佳实践来创建我的解决方案架构。 在我的VS解决方案中,我有一些用于域核心的项目,一些用于基础设施,还有一个用于用户界面的ASP.NET MVC。现在我想向解决方案添加一个IoC容器。我知道最佳实践是添加一个引导程序或启动器项目,该项目引用了IoC容器(在我的例子中是简单的注入器)和解决方案中的所有项目。通过这种方式,我可以将整个解决方案从IoC容器中分离出来,并且我可以在将来轻松地将其替换为其他解决方案。现在我的问题是:

  • 我应该为我的启动器(MVC或类)创建什么类型的项目 图书馆…)

  • 引导者如何启动MVC项目

  • 引导程序是否应该引用ASP.NET MVC包

    先谢谢你


  • 对于大多数项目来说,这是错误的方法

    您应该在靠近应用程序入口点的位置创建一个应用程序(在一个MVC项目中,该项目将位于
    应用程序\u Start
    事件的某处)。它不应该被移入自己的图书馆。组合根目录是应用程序的配置,因此您不会将其移动到单独的项目,就像将
    .config
    文件移动到单独的项目一样

    此外,除非您有将DLL延迟绑定到AppDomain的特定要求(例如,在不重新启动应用程序的情况下上载插件并启动它),否则就IoC而言,体系结构的类型实际上并不重要。架构(Architecture)是层的逻辑排列,可能导致层的物理分离,也可能不导致层的物理分离。但是,从组合根的角度来看,在组合根中耦合在一起的组件(应用程序中唯一应该紧密耦合在一起的部分)

    请注意,这并不妨碍您使用几个类来组织组合根目录中的DI注册—这只是意味着您应该将该代码保留在主项目中,这样可以方便地对其进行编辑


    最后,这个问题在StackOverflow上经常以这样或那样的形式被问到。对于那些寻找正确使用DI的好处和错误使用DI的缺点的明确答案的人,我建议阅读这本书。一旦您了解了DI是什么以及应该如何使用它,体系结构部分就变得更加清晰了。

    这对我来说很有用:我在一个新项目中创建了一个CompositionRoot类,并引用了SimpleInjector。该类有一个名为Compose()的公共方法,该方法注册所需的类型。此项目引用了定义接口和/或实现接口的项目。然后在MVC项目中,在global.aspx中实例化CompositionRoot并调用Compose方法。通过这种方式,我可以轻松地更改DI容器。