上述链接包含一个关于如何使用洋葱分层结构化ASP.NET MVC的示例应用程序.我真的很喜欢,但大多数这些例子使用Ninject(我们都知道这是很慢).我想知道如果有人可能会将如何将不同的DI工具(如SimpleInjector,Unity或Autofac)集成到一个洋葱项目中.
所有图层只有1个依赖关系(包括MVC项目),即核心层是关键.除了“依赖关系分辨率”层,此图层可以引用所有图层.
我很难将MVC项目设置为启动项目,使用DI,而不包括对MVC层中的DI工具的引用.
解决方法
“how to integrate a different DI tool (like SimpleInjector,Unity or
Autofac) into an Onion Project?”
我使用StructureMap而不是Ninject,它的集成方式应该适用于任何其他DI框架.
如您所说,只有依赖关系分辨率层才能引用所有其他层,它是您的洋葱架构的最外层.那么这样做,我创建了一个名为BootStrapper的项目.这是我引用StructureMap程序集的唯一项目.
在这个项目的App_Start文件夹中,我有一个名为StructureMapMvc.cs的文件,如下所示:
[assembly: WebActivator.PreApplicationStartMethod(typeof(XXXX.BootStrapper.App_Start.StructuremapMvc),"Start")] namespace XXXX.BootStrapper.App_Start { public static class StructuremapMvc { public static void Start() { IContainer container = IoC.Initialize(); System.Web.Mvc.DependencyResolver.SetResolver(new StructureMapDependencyResolver(container)); GlobalConfiguration.Configuration.DependencyResolver = new StructureMapHttpDependencyResolver(container); ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); } } }
有趣的是:
[assembly: WebActivator.PreApplicationStartMethod(typeof(XXXX.BootStrapper.App_Start.StructuremapMvc),"Start")]
根据矿块包的描述:
WebActivator is a NuGet package that allows other packages to execute
some startup code in web apps.
很酷啊,是吗最后一件事是确保将BootStrapper项目程序集推送到您的Web应用程序的/ bin文件夹(使用后期构建操作或OutputTo块)易于设置).这将避免您引用您的MVC项目中的BootStrapper项目并破坏洋葱架构原理.
所以,所有这一切,它完全符合Composition Root Pattern,当你的应用程序开始,模块将组合在一起.
希望这可以帮助!