Onion Architecture是一种构建应用程序以保持关注点分离和松散耦合的方式(示例项目位于:http://onionarch.codeplex.com/)。依赖注入(inject)/解决是该架构的一个关键方面,因为它用于将所有层联系在一起。
上面的链接包含一个关于如何使用 Onion 分层构造 ASP.NET MVC 的示例应用程序。我真的很喜欢它,但是这些示例中的大多数都使用 Ninject(我们都知道它很慢)。我想知道是否有人可以详细说明如何将不同的 DI 工具(如 SimpleInjector、Unity 或 Autofac)集成到 Onion 项目中。
关键是所有层都只有1个依赖(包括MVC项目),即Core层。除了 Dependency Resolution 层,该层可以引用所有层。
我很难将 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")]
根据 nugget 包的描述:
WebActivator is a NuGet package that allows other packages to execute some startup code in web apps.
很酷吧?您必须做的最后一件事是确保 BootStrapper 项目程序集将被推送到 。/bin Web 应用程序的文件夹(使用构建后操作或 OutputTo nugget 包易于设置)。这将避免您在 MVC 项目中引用 BootStrapper 项目并打破洋葱架构原则。
所以,有了这一切,它完全符合 Composition Root Pattern当您的应用程序启动时,模块将组合在一起。
希望这可以帮助!
关于.net - 洋葱架构中的依赖解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14891371/