你的问题是
“如何将不同的 DI 工具(如 SimpleInjector、Unity 或 Autofac)集成到 Onion 项目中?”
我使用的是 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")]
根据 nugget 包的描述:
WebActivator 是一个 NuGet 包,它允许其他包在 Web 应用程序中执行一些启动代码。
很酷吧?您必须完成的最后一件事是确保将BootStrapper项目程序集推送到您的 Web 应用程序的/bin文件夹(使用构建后操作或 OutputTo nugget 包轻松设置)。这将避免您在 MVC 项目中引用BootStrapper项目并打破洋葱架构原则。
因此,所有这些都到位后,它完全符合组合根模式,当您的应用程序启动时,模块将组合在一起。
希望这可以帮助!