.net - 洋葱架构中的依赖解析

标签 .net asp.net-mvc dependency-injection onion-architecture

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/

相关文章:

c# - 这个控件叫什么?

javascript - 如何将 Ajax.BeginForm MVC 助手与 JSON 结果一起使用?

c# - WebGrid Helper 分页不适用于 .NET 4.5 MVC 4

java - Spring 集成测试具有依赖注入(inject)的 Controller

Spring 框架 - 注入(inject) bean 子集

c# - 如何在 ASP.NET 5 中动态创建和注入(inject)服务?

c# - 在 C# 中重置 IronScheme 引擎

.net - 发布 .net 强名称私钥的影响?

asp.net-mvc - 返回引用页面

c# - 无法让 C# 中的 SslStream 接受 .net Framework 4.6 的 TLS 1.2 协议(protocol)