基于DDD的.NET开发框架 - ABP依赖注入
返回ABP系列
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。
ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板。
ABP的官方网站:http://www.aspnetboilerplate.com
ABP官方文档:http://www.aspnetboilerplate.com/Pages/Documents
Github上的开源项目:https://github.com/aspnetboilerplate
一、依赖注入概念
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。
依赖注入是一种软件设计模式的一个或多个依赖项注入(或服务),或通过引用传递,为依赖对象(或客户)和客户端状态的一部分。模式之间建立一个客户的依赖关系的行为,它允许程序设计是松散耦合的,依赖倒置和单一职责原则。它直接对比service locator模式,它允许客户了解他们所使用的系统找到依赖。
依赖注入不是目的,它是一系列工具和手段,最终的目的是帮助我们开发出松散耦合、可维护、可测试的代码和程序。这条原则的做法是大家熟知的面向接口,或者说是面向抽象编程。
理想的软件开发设计是“高内聚,低耦合”,高内聚侧重面向对象编程,低耦合侧重面向接口编程,控制反转、依赖注入、依赖倒置都蕴含着面向接口编程的思想。
控制反转把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的"控制反转"概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。
依赖注入是通过反射(reflection)动态的向某个对象提供它所需要的其他对象、
常用依赖注入框架:
Unity:微软patterns&practicest团队开发的IOC依赖注入框架,支持AOP横切关注点。
MEF(Managed Extensibility Framework):是一个用来扩展.NET应用程序的框架,可开发插件系统。
Spring.NET:依赖注入、面向方面编程(AOP)、数据访问抽象,、以及ASP.NET集成。
Autofac:最流行的依赖注入和IOC框架,轻量且高性能,对项目代码几乎无任何侵入性。
PostSharp:实现静态AOP横切关注点,使用简单,功能强大,对目标拦截的方法无需任何改动。
Castle Windsor、StructureMap、Ninject
其实我感觉Autofac挺好用的,一直用的Autofac,不知道到Castle Windsor怎么样。
二、三层和DDD分层依赖关系
1、三层分层依赖如下图:
从引用关系我们就能知道各层的依赖关系:BLL需要依赖DAL,因为BLL中用到了DAL层的实体。UI这一层需要依赖BLL,还需要依赖DAL,因为在UI中也用到了DAL层实体。
如果从换个数据库,DAL需要修改,那DAL的依赖也需要修改。
2、DDD分层依赖关系图
从上图可以知道,表现层和数据访问层都依赖领域模型层,这样的话,如果我们新添加一个UI界面;更换一种数据源的存储和获取方式,只需要修改对应层的代码即可,领域模型层保持了稳定。
减少new引入的依赖及紧耦合最好的方式是使用构造函数注入依赖这种设计模式:即如果我们需要一个依赖的实例,通过构造函数注入。
解耦和最重要的原则就是依赖倒置原则:
高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
简单理解就是组件应该依赖于接口而不是实现。
三、ABP依赖注入底层实现
ABP依赖注入是通过Castle Windsor依赖注入的框架实现。
1、通过实现IConventionalDependencyRegistrar的实例定义注入的约定,然后通过IocManager来读取这个规则完成依赖注入
代码在Abp项目文件的Dependency文件夹下
1)在PreInitialize方法中给IocManager的IConventionalDependencyRegistrar的list中加入BasicConventionalRegistrar
IocManager.AddConventionalRegistrar(new BasicConventionalRegistrar());
2)IocManager维护了一个叫_conventionalRegistrars的list,其中的元素类型就是IConventionalDependencyRegistrar。接着IocManager的RegisterAssemblyByConvention是在模块的Initialize方法中被调用
public override voidInitialize(){IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); }
3)IocManager在RegisterAssemblyByConvention方法中遍历这个list,并根据IConventionalDependencyRegistrar的实例中定义的规则来完成register。
/// <summary>///Registers types of given assembly by all conventional registrars. See<see cref="AddConventionalRegistrar"/>method./// </summary>/// <param name="assembly">Assembly to register</param>public voidRegisterAssemblyByConvention(Assembly assembly){RegisterAssemblyByConvention(assembly,newConventionalRegistrationConfig());}/// <summary>///Registers types of given assembly by all conventional registrars. See<see cref="AddConventionalRegistrar"/>method./// </summary>/// <param name="assembly">Assembly to register</param>/// <param name="config">Additional configuration</param>public voidRegisterAssemblyByConvention(Assembly assembly, ConventionalRegistrationConfig config){var context = new ConventionalRegistrationContext(assembly, this, config);foreach (var registerer in_conventionalRegistrars){registerer.RegisterAssembly(context);}if(config.InstallInstallers){IocContainer.Install(FromAssembly.Instance(assembly));}}
2、直接使用IocManager的Register方法直接完成注入
AbpModule有个受保护的IocManager的成员,所以AbpModule的派生类都可以使用这个IocManager完成注册。
public classAbpWebModule : AbpModule{/// <inheritdoc/>public override voidPreInitialize(){if (HttpContext.Current != null){XmlLocalizationSource.RootDirectoryOfApplication= HttpContext.Current.Server.MapPath("~");}//IocManager直接注入IocManager.Register<IAbpWebModuleConfiguration, AbpWebModuleConfiguration>();Configuration.Localization.Sources.Add(newDictionaryBasedLocalizationSource(AbpWebLocalizedMessages.SourceName,newXmlEmbeddedFileLocalizationDictionaryProvider(Assembly.GetExecutingAssembly(),"Abp.Web.Localization.AbpWebXmlSource")));}/// <inheritdoc/>public override voidInitialize(){IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); }}
基于DDD的.NET开发框架 - ABP依赖注入相关推荐
- 基于DDD的.NET开发框架 - ABP领域服务
返回ABP系列 ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...
- 基于DDD的.NET开发框架 - ABP初探
全称:Asp.Net Boilerplate 官网地址:https://aspnetboilerplate.com/ GitHub地址:https://github.com/aspnetboilerp ...
- 基于DDD的.NET开发框架 - ABP模块设计
返回ABP系列 ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...
- 基于DDD的.NET开发框架 - ABP工作单元(Unit of Work)
返回ABP系列 ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...
- 基于DDD的.NET开发框架 - ABP缓存Caching实现
返回ABP系列 ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...
- ABP 依赖注入(1)
ABP 依赖注入(1) Abp依赖注入的配置方式 手动注册依赖注入关系 按照约定自动注册 通过特性注册 泛型类的注册 依赖注入实现了系统之间.模块之间和对象之间依赖关系的解耦,基本上是现代应用程序框架 ...
- ABP 依赖注入(2)
ABP 依赖注入(2) 依赖注入的使用 构造方法注入 属性注入 从IServiceProvider解析服务 Autofac的使用 容器替换 拦截器与动态代理 接上一篇哈,链接ABP 依赖注入(1) 依 ...
- 3、基于注解的IoC装配与依赖注入
一.XML开启注解支持 1.添加context名称空间 <?xml version="1.0" encoding="UTF-8"?> <bea ...
- 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录(转)
出处:http://www.cnblogs.com/mienreal/p/4528470.html ABP相关岗位招聘:给热爱.NET新技术和ABP框架的朋友带来一个高薪的工作机会 ABP交流会录像视 ...
最新文章
- 我看过的数据库方面的好文章
- 休眠后gpio状态_1.Linux电源管理-休眠与唤醒
- for语句与if语句嵌套的简单应用
- CloudIDE插件在手,按时下班不愁
- 小程序开发及环境搭建及发布
- android 类的设计,Android App的类响应式设计
- webstorm2017.1.3破解教程
- python随机生成字符串_python 怎样随机生成中文字符?
- Linux7安装oracle11g报错 Error in invoking target 'agen
- html微信字体大小布局,微信小程序界面设计入门课程样式wxss中使用css课程字体fontsize字体大小...
- Java程序设计 北京大学 2019冬期末测验
- 第二人生的源码分析(六十四)类LLCurlEasyRequest实现Http请求
- C++ 惯用法之 Nifty Counter
- 软件工程团队项目——搜查令
- [句子成分] 四、状语 定语 同位语
- 关于用户表空间配额的问题
- oracle针对多数据只取最新一条的sql
- 骨传导耳机排名前十名,列举排行靠前的几款骨感耳机
- matlab圆锥曲线,圆锥曲线:MATLAB绘制椭圆方程的图像 来充电吧
- 搞懂质数,质因子,互质,最大公约数,最小公倍数.