版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ABP框架的体系结构及模块系统讲解_ ABP框架是基于ASP.NET的Web开发框架,不过它遵循一种名为DDD(领域驱动设计)的设计模式原则,接下来我们就来看一下ABP框架的体系结构及模块系统讲解 DDD分层 为了削减简单性和提高代码的可重用性,采纳分层架构是一种被广泛接受的技术。 为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将分为四个层次: 呈现层(Presentation):供应一个用户界面,实现用户交互操作。 应用层(Application):进行呈现层与领域层之间的协调,协调业务对象来执行特定的应用程序的任务。它不包含业务规律。 领域层(Domain):包括业务对象
2、和业务规章,这是应用程序的核心层。 基础设施层(Infrastructure):供应通用技术来支持更高的层。例如基础设施层的仓储(Repository)可通过ORM来实现数据库交互。 依据实际需要,可能会有额外添加的层。例如: 分布式服务层(Distributed Service):用于公开应用程序接口供远程客户端调用。比如通过ASP.NET Web API和WCF来实现。 这些都是常见的以领域为中心的分层体系结构。不同的项目在实现上可能会有微小的差别。 ABP的体系结构 一个简洁的解决方案,大致包含5个项目: 每一层可以用一个或多个程序集来实现。 1.领域层(Domain) 领域层就是业务层
3、,是一个项目的核心,全部业务规章都应当在领域层实现。 2.实体(Entity) 实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表。 3.仓储(Repository) 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应当写在基础设施层。 4.领域服务(Domain service) 当处理的业务规章跨越两个(及以上)实体时,应当写在领域服务方法里面。 5.领域大事(Domain Event) 在领域层某些特定状况发生时可以触发领域大事,并且在相应地方捕获并处理它们。 6.工作单元(Unit of Work) 工作单元是一种设计模式,用于维护一个由已经被修改(如增
4、加、删除和更新等)的业务对象组成的列表。它负责协调这些业务对象的长久化工作及并发问题。 应用层(Application) 应用层供应一些应用服务(Application Services)方法供呈现层调用。一个应用服务方法接收一个DTO(数据传输对象)作为输入参数,用法这个输入参数执行特定的领域层操作,并依据需要可返回另一个DTO。在呈现层到领域层之间,不应当接收或返回实体(Entity)对象,应当进行DTO映射。一个应用服务方法通常被认为是一个工作单元(Unit of Work)。用户输入参数的验证工作也应当在应用层实现。ABP供应了一个基础架构让我们很简单地实现输入参数有效性验证。建议用法
5、一种像AutoMapper这样的工具来进行实体与DTO之间的映射。 基础设施层(Infrastructure) 当在领域层中为定义了仓储接口,应当在基础设施层中实现这些接口。可以用法ORM工具,例如EntityFramework或NHibernate。ABP的基类已经供应了对这两种ORM工具的支持。数据库迁移也被用于这一层。 WEB与呈现层(Web Presentation) Web层用法ASP.NET MVC和Web API来实现。可分别用于多页面应用程序(MPA)和单页面应用程序(SPA)。 在SPA中,全部资源被一次加载到客户端扫瞄器中(或者先只加载核心资源,其他资源懒加载),然后通过A
6、JAX调用服务端WebApi接口猎取数据,再依据数据生成HTML代码。不会整个页面刷新。现在已经有许多SPA的JS框架,例如: AngularJs、 DurandalJs、BackboneJs、EmberJs。 ABP可以用法任何类似的前端框架,但是ABP供应了一些关心类,让我们更便利地用法AngularJs和DurandalJs。 在经典的多页面应用(MPA)中,客户端向服务器端发出恳求,服务器端代码(ASP.NET MVC掌握器)从数据库获得数据,并且用法Razor视图生成HTML。这些被生成后的HTML页面被发送回客户端显示。每显示一个新的页面都会整页刷新。 SPA和MPA涉及到完全不同
7、的体系结构,也有不同的应用场景。一个管理后台适合用SPA,博客就更适合用MPA,由于它更利于被搜索引擎抓取。 SignalR是一种从服务器到客户端发送推送通知的完善工具。它能给用户供应丰富的实时的体验。 已经有许多客户端的Javascript框架或库,JQuery是其中最流行的,并且它有成千上万免费的插件。用法Bootstrap可以让我们更轻松地完成写Html和CSS的工作。 ABP也实现了依据Web API接口自动创建 Javascript的代码函数,来简化JS对Web Api的调用。还有把服务器端的菜单、语言、设置等生成到JS端。(但是在我自己的项目中,我是把这些自动生胜利能关闭的,由于必
8、要性不是很大,而这些又会比较影响性能)。 ABP会自动处理服务器端返回的特别,并以友好的界面提示用户。 ABP模块系统 ABP框架供应了创建和组装模块的基础,一个模块能够依靠于另一个模块。在通常状况下,一个程序集就可以看成是一个模块。在ABP框架中,一个模块通过一个类来定义,而这个类要继承自AbpModule。 译者注:假如学习过Orchard的伴侣,应当知道module模块的强大了。模块的本质就是可重用性,你可以在任意的地方去调用,而且通过实现模块,你写的模块也可以给别人用。 Assembly程序集:Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个
9、集合。最简洁的理解就是:一个你自己写的类库生成的dll就可以看做是一个程序集,这个程序集可以包括许多类,类又包括许多方法等。 .net可以通过反射猎取一个程序集中的类以及方法。 下面的例子,我们开发一个可以在多个不同应用中被调用MybolgApplication模块,代码如下: public class MyBlogApplicationModule : AbpModule /定义 public override void Initialize() /初始化 IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembl
10、y(); /这行代码的写法基本上是不变的。它的作用是把当前程序集的特定类或接口注册到依靠注入容器中。 ABP框架会扫描全部的程序集,并且发觉AbpModule类中全部已经导入的全部类,假如你已经创建了包含多个程序集的应用,对于ABP,我们的建议是为每一个程序集创建一个Module(模块)。 生命期大事 在一个应用中,abp框架调用了Module模块的一些指定的方法来进行启动和关闭模块的操作。我们可以重载这些方法来完成我们自己的任务。 ABP框架通过依靠关系的挨次来调用这些方法,假如:模块A依靠于模块B,那么模块B要在模块A之前初始化,模块启动的方法挨次如下: 1.PreInitialize-B
11、 2.PreInitialize-A 3.Initialize-B 4.Initialize-A 5.PostInitialize-B 6.PostInitialize-A 下面是具体方法的说明: 1.PreInitialize 预初始化:当应用启动后,第一次会调用这个方法。在依靠注入注册之前,你可以在这个方法中指定自己的格外代码。举个例子吧:假如你创建了一个传统的登记类,那么你要先注册这个类(用法IocManager对登记类进行注册),你可以注册大事到IOC容器。等。 2.Initialize 初始化:在这个方法中一般是来进行依靠注入的注册,一般我们通过IocManager.Register
12、AssemblyByConvention这个方法来实现。假如你想实现自定义的依靠注入,那么请参考依靠注入的相关文档。 3.PostInitialize 提交初始化:最终一个方法,这个方法用来解析依靠关系。 4.Shutdown 关闭:当应用关闭以后,这个方法被调用。 模块依靠(Module dependencies) Abp框架会自动解析模块之间的依靠关系,但是我们还是建议你通过重载GetDependencies方法来明确的声明依靠关系。 DependsOn(typeof(MyBlogCoreModule)/通过注解来定义依靠关系 public class MyBlogApplicationM
13、odule : AbpModule public override void Initialize() IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly(); 例如上面的代码,我们就声明白MyBlogApplicationModule和MyBlogCoreModule的依靠关系(通过属性attribute),MyBlogApplicationModule这个应用模块依靠于MyBlogCoreModule核心模块,并且,MyBlogCoreModule核心模块会在MyBlogApplicationModul
14、e模块之前进行初始化。 如何自定义的模块方法 我们自己定义的模块中可能有方法被其他依靠于当前模块的模块调用,下面的例子,假设模块2依靠于模块1,并且想在预初始化的时候调用模块1的方法。 public class MyModule1 : AbpModule public override void Initialize() /初始化模块 IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly();/这里,进行依靠注入的注册。 public void MyModuleMethod1() /这里写自定义的方法。 DependsOn(typeof(MyModule1) public class MyModule2 : AbpModule private readonly MyModule1 _myModule1; public MyModule2(MyModule1 myModule1) _myModule1 = myModule1; publi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省金华市2024年中考数学一模试题含答案
- 开封文化艺术职业学院《创新与创业管理A》2023-2024学年第一学期期末试卷
- 江苏警官学院《现代舞基训》2023-2024学年第一学期期末试卷
- 吉安职业技术学院《机器人技术基础B》2023-2024学年第一学期期末试卷
- 湖南理工学院南湖学院《广播电视新闻播音与主持》2023-2024学年第一学期期末试卷
- 黑龙江建筑职业技术学院《CA课件设计》2023-2024学年第一学期期末试卷
- 高考物理总复习《磁场的性质》专项测试卷带答案
- 重庆对外经贸学院《快速建筑设计》2023-2024学年第一学期期末试卷
- 镇江市高等专科学校《食品加工安全控制》2023-2024学年第一学期期末试卷
- 浙江交通职业技术学院《粉体工程与设备》2023-2024学年第一学期期末试卷
- 《榜样9》观后感心得体会四
- 《住院患者身体约束的护理》团体标准解读课件
- 酒店一线员工绩效考核指标体系优化研究
- 全面设备管理(TPM)培训资料-课件
- 高中地理《外力作用与地表形态》优质课教案、教学设计
- 车间生产管理流程图模板
- 河北省邢台市各县区乡镇行政村村庄村名居民村民委员会明细
- 市场部绩效考核表
- 10000中国普通人名大全
- 学霸高中数学高中数学笔记全册(最终)
- 热棒的要点及要求
评论
0/150
提交评论