洋葱架构中的依赖解析

2023-11-22

The 洋葱架构是一种构建应用程序以保持关注点分离和松散耦合的方法(示例项目位于:http://onionarch.codeplex.com/)。依赖注入/解析是该架构的一个关键方面,因为它用于将所有层连接在一起。

上面的链接包含一个有关如何使用 Onion 分层构建 ASP.NET MVC 的示例应用程序。我真的很喜欢它,但大多数示例都使用 Ninject(我们都知道它非常慢)。我想知道是否有人可以详细说明如何将不同的 DI 工具(如 SimpleInjector、Unity 或 Autofac)集成到 Onion 项目中。

关键是所有层都只有 1 个依赖项(包括 MVC 项目),即 Core 层。除Dependency Resolution层外,该层可以引用所有层。

我很难将 MVC 项目设置为启动项目,使用 DI,并且不在 MVC 层中包含对 DI 工具的引用。


你的问题是

“如何集成不同的 DI 工具(如 SimpleInjector、Unity 或 Autofac)进入洋葱项目?”

我使用 StructureMap 而不是 Ninject,它的集成方式应该适用于任何其他 DI 框架。

正如您所说,只有依赖解析层应该引用所有其他层,它是洋葱架构的最外层。好吧,为此,我创建了一个名为引导程序。这是我引用 StructureMap 程序集的唯一项目。 在里面应用程序_启动该项目的文件夹中,我有一个名为StructureMap Mvc.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 应用程序中的一些启动代码。

很酷吧?您必须做的最后一件事是确保引导程序项目组装将被推至/binWeb 应用程序的文件夹(使用构建后操作或 OutputTo 块包可轻松设置)。这将避免您引用引导程序在您的 MVC 项目中进行项目并打破洋葱架构原则。

因此,有了这一切,它就完全符合组合根模式当您的应用程序启动时,模块将组合在一起。

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

洋葱架构中的依赖解析 的相关文章

随机推荐