微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.net – 洋葱建筑中的依赖性解析

Onion Architecture是一种构建应用程序的方式,以保持关注和松散耦合的分离(示例项目为: http://onionarch.codeplex.com/).依赖注入/分辨率是此架构的关键方面,因为它用于将所有图层绑定在一起.

上述链接包含一个关于如何使用洋葱分层结构化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,当你的应用程序开始,模块将组合在一起.

希望这可以帮助!

原文地址:https://www.jb51.cc/aspnet/249017.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐