ABP框架模板开发手册
- 格式:docx
- 大小:1.22 MB
- 文档页数:29
实战框架ABPabp及实战框架概述接触abp也快⼀年了,有过⼤半年的abp项⽬开发经验,⽬前项⽬中所⽤的abp框架版本为0.10.3,最新的abp框架已经到了1.4,并且⽀持了 core。
关于abp框架有哪些特性、有什么好处我这⾥就不讲了。
如果你对abp不太了解请先去 Abp官⽹了解或者参考我的学习之路⾥⾯的链接。
在这系列的⽂章⾥⾯我会把我在实战中的经验、碰到的坑分享出来。
希望跟⼤家⼀起学习讨论。
学习之路框架概述这个框架版本主要⽤的技术有 mvc5.0、web api、EF 6.1 。
⼀、整体框架概述Topeveyr.Core:主要存放业务实体以及仓储接⼝。
Application⽂件夹:这⾥⾯有两个应⽤服务层,当时是想做读写分离的,⼀个读⼀个写。
但是底层的数据访问层没有实现读写分离。
(全完实现读写分离还没找到解决⽅案)Topevery.EntityFramework.Oracle:主要存放实体映射⽂件、仓储实现类。
Topevery.Web:web界⾯。
Topevery.WebApi:api接⼝。
Topevery.Infrastructure:框架中跟业务⽆关的公共类。
Topevery.WF.Framework:流程业务相关项⽬。
Topevery.Abp:封装了abp类的公共类。
TimeServices:定时服务类库。
Dapper:⼀款轻量级orm框架。
主要是为了⽀持EF操作Oracled包⽽加进来的。
如果是其他数据库可以忽略该项⽬。
为了更好的统⼀,以后应该全部换成存储过程。
Zero⽂件夹:这⾥⾯的三个项⽬分别对应abp的应⽤服务层、核⼼层、数据访问层。
这个项⽬主要⽤来操作⼀些基础信息表以及公共模块。
⽐如,⽤户、⾓⾊、权限、部门等。
⼆、整体框架设计整体框架设计⾥⾯,我觉得“模块”的⽐较重要,这⾥就讲⼀讲我对模块的理解。
每个单独类库或者应⽤程序即是⼀个模块。
当需要⽤到Ioc容器、abp启动配置或者是在应⽤程序启动的时候做⼀些设置就需要⽤到abp⾥⾯的模块。
基于DDD的.NET开发框架-ABP模块设计ABP是“ Boilerplate Project (样板项⽬)”的简称。
Boilerplate是⼀个⽤最佳实践和流⾏技术开发现代WEB应⽤程序的新起点,它旨在成为⼀个通⽤的WEB应⽤程序框架和项⽬模板。
研究过orchard和nopcommerce的都应该知道模块概念,ABP的模块也和他们是⼀回事。
实现原理也都⼀样:应⽤程序⼀般都是先定义模块接⼝,然后把模块编译的dll放到固定的⽬录中(ABP只能放到bin下),应⽤程序主程序通过加载那些实现了插件接⼝的dll来实现插件的使⽤。
ABP 框架提供了创建和组装模块的基础,⼀个模块能够依赖于另⼀个模块。
在通常情况下,⼀个程序集就可以看成是⼀个模块。
在 ABP 框架中,⼀个模块通过⼀个类来定义,⽽这个类要继承⾃ AbpModule。
nopcommerce插件实现可以到:了解下。
下⾯的例⼦,我们开发⼀个可以在多个不同应⽤中被调⽤MybolgApplication模块,代码如下:public class MyBlogApplicationModule : AbpModule //定义{public override void Initialize() //初始化{IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());//这⾏代码的写法基本上是不变的。
它的作⽤是把当前程序集的特定类或接⼝注册到依赖注⼊容器中。
}}ABP框架会扫描所有的程序集,并且发现AbpModule类中所有已经导⼊的所有类,如果你已经创建了包含多个程序集的应⽤,对于ABP,我们的建议是为每⼀个程序集创建⼀个Module(模块)。
⽣命周期:在⼀个应⽤中,abp框架调⽤了Module模块的⼀些指定的⽅法来进⾏启动和关闭模块的操作。
我们可以重载这些⽅法来完成我们⾃⼰的任务。
ABP实践(⼀)创建ABP项⽬ABP是⼀个开源应⽤程序框架,专注于基于 Core的Web应⽤程序开发,但也⽀持开发其他类型的应⽤程序.ABP整合了.net开发中的各种技术新版的ABP需要依赖.NET 6的环境,需要先安装对应的SDK⼀.安装ABPdotnet tool install -g Volo.Abp.Cli⼆.创建项⽬这⾥使⽤ABP CLI来进⾏创建abp new ABP.Demo -u mvc -d ef -dbms MySQL -o "D:\ABPDemo"new的常⽤命令--output-folder或者-o: 指定输出⽂件夹,默认是当前⽬录.--ui或者-u: 指定ui框架.默认mvc框架.其他选项 (mvc、angular、blazor、none)--database-provider或者-d: 指定数据库提供程序.默认是ef.其他选项(ef、mongodb)-dbms:指定数据库类型三.⽣成的代码结构项⽬结构项⽬组织在src和test⽂件夹中. src⽂件夹包含实际应⽤程序,该应⽤程序基于前⾯提到的原则进⾏分层. 下图展⽰了解决⽅案的层和项⽬的依赖关系:Domain.Shared 项⽬项⽬包含常量,枚举和其他对象,这些对象实际上是领域层的⼀部分,但是解决⽅案中所有的层/项⽬中都会使⽤到.该项⽬不依赖解决⽅案中的其他项⽬. 其他项⽬直接或间接依赖该项⽬Domain 项⽬解决⽅案的领域层. 它主要包含实体, 集合根, 领域服务, 值类型, 仓储接⼝和解决⽅案的其他领域对象. 它依赖.Domain.Shared项⽬,因为项⽬中会⽤到它的⼀些常量,枚举和定义其他对象.Application.Contracts 项⽬项⽬主要包含应⽤服务 interfaces 和应⽤层的数据传输对象 (DTO). 它⽤于分离应⽤层的接⼝和实现. 这种⽅式可以将接⼝项⽬做为约定包共享给客户端.它依赖.Domain.Shared因为它可能会在应⽤接⼝和DTO中使⽤常量,枚举和其他的共享对象.Application 项⽬项⽬包含.Application.Contracts项⽬的应⽤服务接⼝实现.它依赖.Application.Contracts项⽬, 因为它需要实现接⼝与使⽤DTO.它依赖.Domain项⽬,因为它需要使⽤领域对象(实体,仓储接⼝等)执⾏应⽤程序逻辑..EntityFrameworkCore 项⽬这是集成EF Core的项⽬. 它定义了DbContext并实现.Domain项⽬中定义的仓储接⼝.它依赖.Domain项⽬,因为它需要引⽤实体和仓储接⼝..EntityFrameworkCore.DbMigrations 项⽬包含解决⽅案的EF Core数据库迁移. 它有独⽴的DbContext来专门管理迁移.(ABP是⼀个模块化的框架,理想的设计是让每个模块都有⾃⼰的DbContext类. 这时⽤于迁移的DbContext就会发挥作⽤. 它将所有的DbContext配置统⼀到单个模型中以维护单个数据库的模式. 对于更⾼级的场景,可以程序可以拥有多个数据库(每个数据库有⼀个或多个模块表)和多个迁移DbContext(每个都维护不同的数据库模式))它依赖.EntityFrameworkCore项⽬,因为它重⽤了应⽤程序的DbContext配置 ..DbMigrator 项⽬必要时创建数据库(没有数据库时).应⽤未迁移的数据库迁移.初始化种⼦数据(当你需要时).它依赖.EntityFrameworkCore.DbMigrations项⽬ (针对EF Core),因为它需要访问迁移⽂件.它依赖.Application.Contracts项⽬,因为它需要访问权限定义在初始化种⼦数据时为管理员⽤户赋予所有权限..HttpApi 项⽬⽤于定义API控制器.它依赖.Application.Contracts项⽬,因为它需要注⼊应⽤服务接⼝..HttpApi.Client 项⽬定义C#客户端代理使⽤解决⽅案的HTTP API项⽬. 可以将上编辑共享给第三⽅客户端,使其轻松的在DotNet应⽤程序中使⽤你的HTTP API(其他类型的应⽤程序可以⼿动或使⽤其平台的⼯具来使⽤你的API).它依赖.Application.Contracts项⽬,因为它需要使⽤应⽤服务接⼝和DTO..Web 项⽬包含应⽤程序的⽤户界⾯(UI).如果使⽤ Core MVC UI, 它包括Razor页⾯,javascript⽂件,样式⽂件,图⽚等...包含应⽤程序主要的appsettings.json配置⽂件,⽤于配置数据库连接字符串和应⽤程序的其他配置依赖.HttpApi项⽬,因为UI层需要使⽤解决⽅案的API和应⽤服务接⼝.Test 项⽬.Domain.Tests⽤于测试领域层. .Application.Tests⽤于测试应⽤层. .EntityFrameworkCore.Tests⽤于测试EF Core配置与⾃定义仓储. .Web.Tests⽤于测试UI(适⽤于 Core MVC UI). .TestBase所有测试项⽬的基础(共享)项⽬. 。
ABP开发教程范文1.ABP基本概念ABP的核心概念是模块化和领域驱动设计。
在ABP中,应用程序被组织成多个模块,每个模块负责一个特定的功能或领域。
每个模块可以包含实体、服务、仓储、应用程序服务等组件。
2.ABP开发环境搭建3.创建模块在ABP中,可以通过使用命令行工具(ABPCLI)来创建新的模块。
首先,打开命令行窗口,导航到项目的根目录下。
然后运行以下命令来创建一个新的模块:dotnet abp create-module MyModule这将在项目中创建一个名为“MyModule”的新模块。
创建模块后,可以添加实体、服务、仓储等组件来实现模块的功能。
4.定义实体在ABP中,实体是应用程序的核心组件。
可以使用EF Core或Dapper等ORM工具来定义和操作实体。
在模块中,创建一个新的实体类,并定义其属性和关联关系。
例如,我们可以创建一个名为“Product”的实体类:public class Product : Entity<Guid>public string Name { get; set; }public decimal Price { get; set; }5.创建应用程序服务应用程序服务是用于实现业务逻辑的组件。
在ABP中,可以通过继承ApplicationService类来创建应用程序服务。
在模块中,创建一个新的应用程序服务类,并实现其方法。
例如,我们可以创建一个名为“ProductAppService”的应用程序服务:public class ProductAppService : ApplicationServiceprivate readonly IRepository<Product, Guid>_productRepository;public ProductAppService(IRepository<Product, Guid> productRepository)_productRepository = productRepository;}public async Task<List<ProductDto>> GetAllvar products = await _productRepository.GetAllListAsync(;return ObjectMapper.Map<List<ProductDto>>(products);}6.创建API控制器使用ABP创建一个API控制器非常简单。
ABP框架的体系结构及模块系统分析作者:陈浩来源:《电脑知识与技术》2016年第32期摘要:ABP是“ Boilerplate Project 即样板项目”的简称。
Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板。
Boilerplate 基于DDD领域驱动设计的经典分层架构思想,实现了众多DDD的概念。
该文针对此问题讨论了ABP的设计过程。
关键词:ABP;;领域驱动设计中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2016)32-0045-021 ABP框架模式概述ABP框架是基于的Web开发框架,不过它遵循一种名为DDD(领域驱动设计)的设计模式原则,下面就ABP框架的体系结构及模块系统做以分析。
为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术。
为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将分为四个层次:展现层(Presentation):提供一个用户界面,实现用户交互操作。
应用层(Application):进行展现层与领域层之间的协调,协调业务对象来执行特定的应用程序的任务。
它不包含业务逻辑。
领域层(Domain):包括业务对象和业务规则,这是应用程序的核心层。
基础设施层(Infrastructure):提供通用技术来支持更高的层。
例如基础设施层的仓储(Repository)可通过ORM来实现数据库交互。
2 ABP体系结构分析一个简单的解决方案,大致包含5个项目,每一层可以用一个或多个程序集来实现,具体分析如下:1)领域层(Domain)领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现。
2)实体(Entity)实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表。
3)仓储(Repository)仓储用来操作数据库进行数据存取。
ABP开发框架前后端开发系列---(1)框架的总体介绍ABP是 Boilerplate的简称,ABP是⼀个开源且⽂档友好的应⽤程序框架。
ABP不仅仅是⼀个框架,它还提供了⼀个最徍实践的基于领域驱动设计(DDD)的体系结构模型。
学习使⽤ABP框架也有⼀段时间了,⼀直想全⾯了解下这个框架的整个来龙去脉,并把想把它使⽤历程整理成⼀个系列出来,不过⼀直没有下笔来写这篇⽂章的开篇,就是希望能够深⼊了解,再深⼊了解⼀些,希望⾃⼰能够理解透彻⼀些,不能误⼈⼦弟,也不想和⽹上千篇⼀律的翻译官⽹的内容,官⽹的英⽂介绍也已经很详细了,于是我觉得还是以实际使⽤的过程进⾏⼀定的整理会更好。
初次了解ABP框架,对它还是⾮常惊艳的,它基本上是.NET 领域架构的集⼤成者,⼏乎囊括了我们.NET领域排的上名的各种技术应⽤,⽽且它本⾝可以⽀持.net framework和.net core两种技术流派,对它的介绍也是⾮常感兴趣。
1)ABP框架的特点我们来⼤概了解下ABP框架涉及到的内容。
依赖注⼊,这个部分使⽤ Castle windsor (依赖注⼊容器)来实现依赖注⼊,这个也是我们经常使⽤IOC来处理的⽅式;Repository仓储模式,已实现了Entity Framework、NHibernate、MangoDB、内存数据库等,仓储模式可以快速实现对数据接⼝的调⽤;⾝份验证与授权管理,可以使⽤声明特性的⽅式对⽤户是否登录,或者接⼝的权限进⾏验证,可以通过⼀个很细粒度的⽅式,对各个接⼝的调⽤权限进⾏设置;数据有效性验证,ABP⾃动对接⼝的输⼊参数对象进⾏⾮空判断,并且可以根据属性的申请信息对属性的有效性进⾏校验;审计⽇志记录,也就是记录我们对每个接⼝的调⽤记录,以及对记录的创建、修改、删除⼈员进⾏记录等处理;Unit Of Work⼯作单元模式,为应⽤层和仓储层的⽅法⾃动实现数据库事务,默认所有应⽤服务层的接⼝,都是以⼯作单元⽅式运⾏,即使它们调⽤了不同的存储对象处理,都是处于⼀个事务的逻辑⾥⾯;异常处理,ABP框架提供了⼀整套⽐较完善的流程处理操作,可以很⽅便的对异常进⾏进⾏记录和传递;⽇志记录,我么可以利⽤Log4Net进⾏常规的⽇志记录,⽅便我们跟踪程序处理信息和错误信息;多语⾔/本地化⽀持,ABP框架对多语⾔的处理也是⽐较友好的,提供了对XML、JSON语⾔信息的配置处理;Auto Mapping⾃动映射,这个是ABP的很重要的对象隔离概念,通过使⽤AutoMaper来实现域对象和DTO对象的属性映射,可以隔离两者的逻辑关系,但是⼜能轻松实现属性信息的赋值;动态Web API层,利⽤这个动态处理,可以把Application Service 直接发布为Web API层,⽽不需要在累赘的为每个业务对象⼿⼯创建⼀个Web API的控制器,⾮常⽅便;动态JavaScript的AJax代理处理,可以⾃动创建Javascript 的代理层来更⽅便使⽤Web Api,这个在Web层使⽤。
ABP⼊门教程ABP⼊门教程ABP是“ Boilerplate Project (样板项⽬)”的简称。
Boilerplate是⼀个⽤最佳实践和流⾏技术开发现代WEB应⽤程序的新起点,它旨在成为⼀个通⽤的WEB应⽤程序框架和项⽬模板。
ABP的官⽅⽹站:ABP在Github上的开源项⽬:ABP 的由来“DRY——避免重复代码”是⼀个优秀的开发者在开发软件时所具备的最重要的思想之⼀。
我们在开发企业WEB应⽤程序时都有⼀些类似的需求,例如:都需要登录页⾯、⽤户/⾓⾊管理、权限验证、数据有效性验证、多语⾔/本地化等等。
⼀个⾼品质的⼤型软件都会运⽤⼀些最佳实践,例如分层体系结构、领域驱动设计、依赖注⼊等。
我们也可能会采⽤ORM、数据库迁移(Database Migrations)、⽇志记录(Logging)等⼯具。
从零开始创建⼀个企业应⽤程序是⼀件繁琐的事,因为需要重复做很多常见的基础⼯作。
许多公司都在开发⾃⼰的应⽤程序框架来重⽤于不同的项⽬,然后在框架的基础上开发⼀些新的功能。
但并不是每个公司都有这样的实⼒。
假如我们可以分享的更多,也许可以避免每个公司或每个项⽬的重复编写类似的代码。
作者之所以把项⽬命名为“ Boilerplate”,就是希望它能成为开发⼀般企业WEB应⽤的新起点,直接把ABP作为项⽬模板。
ABP是什么?ABP是为新的现代Web应⽤程序使⽤最佳实践和使⽤最流⾏⼯具的⼀个起点。
可作为⼀般⽤途的应⽤程序的基础框架或项⽬模板。
它的功能包括:服务器端:基于最新的.NET技术(⽬前是 MVC 5、Web API 2、C# 5.0,在 5正式发布后会升级)实现领域驱动设计(实体、仓储、领域服务、领域事件、应⽤服务、数据传输对象,⼯作单元等等)实现分层体系结构(领域层,应⽤层,展现层和基础设施层)提供了⼀个基础架构来开发可重⽤可配置的模块集成⼀些最流⾏的开源框架/库,也许有些是你正在使⽤的。
提供了⼀个基础架构让我们很⽅便地使⽤依赖注⼊(使⽤Castle Windsor作为依赖注⼊的容器)提供Repository仓储模式⽀持不同的ORM(已实现Entity Framework 、NHibernate、MangoDb和内存数据库)⽀持并实现数据库迁移(EF 的 Code first)模块化开发(每个模块有独⽴的EF DbContext,可单独指定数据库)包括⼀个简单的和灵活的多语⾔/本地化系统包括⼀个 EventBus来实现服务器端全局的领域事件统⼀的异常处理(应⽤层⼏乎不需要处理⾃⼰写异常处理代码)数据有效性验证( MVC只能做到Action⽅法的参数验证,ABP实现了Application层⽅法的参数有效性验证)通过Application Services⾃动创建Web Api层(不需要写ApiController层了)提供基类和帮助类让我们⽅便地实现⼀些常见的任务使⽤“约定优于配置原则”客户端:Bootstrap、Less、AngularJs、jQuery、Modernizr和其他JS库: jQuery.validate、jQuery.form、jQuery.blockUI、json2等为单页⾯应⽤程序(AngularJs、Durandaljs)和多页⾯应⽤程序(Bootstrap+Jquery)提供了项⽬模板。
ABP Next 是一个开源的 Boilerplate 框架的继承者,它提供了一种快速、易用的方式来创建企业级的应用程序。
本文将介绍如何初始化 ABP Next 框架,并调用其模块的方法。
一、初始化 ABP Next1. 下载 ABP Next我们需要从冠方全球信息站(xxx)下载 ABP Next 框架的最新版本。
2. 创建新项目在下载并安装 ABP Next 框架之后,我们可以使用命令行工具或Visual Studio对ABP Next进行初始化。
在命令行中执行以下命令来创建一个新的ABP Next项目:```shellabp new MyProjectName```3. 选择模板在创建项目的过程中,我们可以选择不同的模板来快速构建一个符合我们需求的项目。
4. 配置数据库ABP Next 默认使用Entity Framework Core作为对象关系映射(ORM)框架,我们需要配置数据库连接并进行迁移。
5. 启动项目完成项目初始化后,我们可以使用命令行工具或Visual Studio来启动项目。
二、调用模块方法ABP Next 框架提供了各种模块来简化开发流程,我们可以通过以下步骤来调用这些模块的方法。
1. 引用模块在需要使用模块功能的地方,首先我们需要在代码中引用相应的模块。
如果我们需要使用身份认证模块,可以在代码中引用Identity模块:```csharpusing Volo.Abp.Identity;```2. 获取模块实例在引用了模块后,我们可以通过依赖注入系统来获取模块的实例。
我们可以在控制器中通过构造函数注入Identity模块的实例:```csharpprivate readonly IdentityUserManager _userManager;public MyController(IdentityUserManager userManager){_userManager = userManager;}```3. 调用模块方法一旦我们获取了模块的实例,就可以调用模块提供的方法来完成相应的功能。
ABP框架模板开发手册杭州蒙特信息技术有限公司2018年1月目录1ABP框架介绍 (3)1.1ABP简介 (3)1.2ABP多层结构 (3)1.3ABP环境 (5)1.4开发环境 (5)2搭建网站 (5)2.1获取源码 (5)2.2搭建数据库 (6)2.3搭建站点 (8)3模块开发 (9)3.1领域层 (9)3.2应用层 (18)4后台页面 (22)5前台页面 (27)6后台配置....................................................................................................错误!未定义书签。
1ABP框架介绍1.1ABP简介我们总是对不同的需求开发不同的应用。
但至少在某些层面上,一次又一次地重复实现通用的和类似的功能。
如:授权,验证,异常处理,日志,本地化,数据库连接管理,设置管理,审核日志等功能。
所以我们创建架构和最佳实践,如分层和模块架构,DDD,依赖注入等,并尝试开发应用时基于一些约定。
由于所有这些是非常耗时而且很难单独创建并可适用于每个项目,许多公司创建自己的框架,他们用自己的框架能快速开发新应用而且不出错。
但不是所有的公司都是幸运的,大部分公司没有时间,预算和团队来开发好的框架。
他们甚至都没有可能创建一个框架,因为编写文档,培训开发人员和维护框架都是非常困难的。
Boilerplate (ABP) 是一个开源并且有丰富文档的应用框架,开发宗旨是:“为所有公司,所有开发人员,开发出一个通用框架!”,而且不只是一个框架,同时提供一个强大的基于DDD的构架模型和最佳实践。
1.2ABP多层结构一个应用的代码库的分层是一个广为接受的技术,用来减少复杂度和提高代码复用性。
ABP依照DDD理念来分层,在DDD里有4个基本的层:•表示层:为用户提供一个界面。
使用应用层来完成用户交互。
•应用层:表示层与领域层的媒介。
ABP快速开发框架教程整理
ABP是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板,基于DDD的经典分层架构思想,实现了众多DDD的概念,诞生的主要目的就是为了让.NET程序员秒变架构师,将.NET企业级项目的主流开发技术、最先进的架构整合起来,让.NET工程师能够更快的开发出更好的项目。
Boilerplate是一个用最佳实践和流行技术开发现代WEB 应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板。
ABP是基于最新的 CORE, MVC和 Web API 技术的应用程序框架。
并使用流行的框架和库,它提供了便于使用的授权,依赖注入,验证,异常处理,本地化,日志记录,缓存等常用功能。
ABP实现了多层架构(领域层,应用层,基础设施层和表示层),以及领域驱动设计(实体,存储库,领域服务,应用程序服务,DTO 等)。
还实现和提供了良好的基础设施来实现最佳实践,如依赖注入。
ABP轻松地为您的项目创建启动模板。
它默认包括最常用的框架和库。
还允许您选择单页(Angularjs)或多页架构,EntityFramework或NHibernate作为ORM。
关于ABP框架高质量学习资料整理汇总「持续更新」
ABP入门系列目录-学习ABP框架之实操演练系列
Boilerplate 博客系列
ABP框架理论研究总结系列
ABP理论基础篇系列博客
基于DDD的现代开发框架-ABP系列文章总目录
ABP源码分析系列文章目录。
ABP框架模板开发手册杭州蒙特信息技术有限公司2018年1月目录1ABP框架介绍 (3)1.1ABP简介 (3)1.2ABP多层结构 (3)1.3ABP环境 (5)1.4开发环境 (5)2搭建网站 (5)2.1获取源码 (5)2.2搭建数据库 (6)2.3搭建站点 (8)3模块开发 (9)3.1领域层 (9)3.2应用层 (18)4后台页面 (22)5前台页面 (27)6后台配置....................................................................................................错误!未定义书签。
1ABP框架介绍1.1ABP简介我们总是对不同的需求开发不同的应用。
但至少在某些层面上,一次又一次地重复实现通用的和类似的功能。
如:授权,验证,异常处理,日志,本地化,数据库连接管理,设置管理,审核日志等功能。
所以我们创建架构和最佳实践,如分层和模块架构,DDD,依赖注入等,并尝试开发应用时基于一些约定。
由于所有这些是非常耗时而且很难单独创建并可适用于每个项目,许多公司创建自己的框架,他们用自己的框架能快速开发新应用而且不出错。
但不是所有的公司都是幸运的,大部分公司没有时间,预算和团队来开发好的框架。
他们甚至都没有可能创建一个框架,因为编写文档,培训开发人员和维护框架都是非常困难的。
Boilerplate (ABP) 是一个开源并且有丰富文档的应用框架,开发宗旨是:“为所有公司,所有开发人员,开发出一个通用框架!”,而且不只是一个框架,同时提供一个强大的基于DDD的构架模型和最佳实践。
1.2ABP多层结构一个应用的代码库的分层是一个广为接受的技术,用来减少复杂度和提高代码复用性。
ABP依照DDD理念来分层,在DDD里有4个基本的层:•表示层:为用户提供一个界面。
使用应用层来完成用户交互。
•应用层:表示层与领域层的媒介。
协调服务业对象执行指定的应用任务。
•领域层:包含业务对象和业务规则。
是整个应用的核心。
•基础层:提供支持更高层的通用技术。
一个基础层的典型例子是通过ORM框架实现与数据库的交互的仓储,或是实现发送邮件的邮件供应器。
也可以根据需要添加层,例如:•分布服务层:为远程客户端公开应用特性。
像 web API和WCF等。
这些都是以领域为核心的架构的通用层。
实现上可能有些细微的差别。
层和结构的预览如下ABP分层结构图如下1.3ABP环境前台环境MVC + Bootstrap后台环境Angular框架 + AdminLTE + Bootstrap基础环境.NET Framework 4.6.1 + EF1.4开发环境TypeScript:微软开发的自由和开源的编程语言,这是Javascript的超集;Web Compiler: A Visual Studio extension that compiles LESS, Sass, JSX, ES6 and CoffeeScript files;如何ABP的.NET框架是Core 2.0时则需要使用Visual Studio 20172搭建网站2.1获取源码第一步:通过SVN获取源码,源码下载之后Visual Studio打开源文件,第二步:用Visual Studio还原NuGet包如下图第三步:重新生成解决方案(检测项目正确性和完整性);2.2搭建数据库2.2.1配置信息第一步:创建空数据库database:database(数据库);uid:uid(用户名);pwd:ILwFjPFH8J(密码);第二步:修改配置文件g,配置网站数据库信息,更改ConnectionStrings的数据库连接字符串信息;database:数据库名 ,uid:用户名,pwd:密码;配置方法如下图2.2.2创建数据库第一步:打开程序包管理器控制台第二步:选择"EntityFramework"项目第三步:将Web项目设置为启动项第四步:执行命令创建数据库及表:Update-Database–Verbose第五步:执行完打开数据库管理器查看,如下图所示说明成功了到这里数据库的搭建工作完成。
2.3搭建站点第一步:重新生成解决方案第二步:将Mt.文件夹内的所有文件拷贝至网站的根目录下第三步:访问网站;后台网址:域名/B;默认账号:admin,密码:123qwe;开发者账号:mountor,密码:123qwe后台页面3模块开发3.1领域层领域层必须实现所有业务规则。
实体:展示数据和领域业务的操作。
通常地它们映射到数据库表。
仓储:类似于对象集合,用来获取和持久化实体到数据源(数据库)。
领域层定义了仓储,但不实现它们,由基础层来实现它们。
领域事件:定义领域里特定的事件,并触发和处理它们。
领域服务利用实体(及其它领域对象)实现那些不属于某个单独实体的业务规则。
工作单元:是一个管理数据库连接和事务的设计模式,跟踪实体变化并保存变化到数据存储。
领域层定义了它,但由基础层实现它。
这一层应该尽可能地独立于第三方类库。
3.1.1实体类实体是DDD一个核心的概念。
Eric Evans是这么描述的:“一个对象根本上不是按它的特性定义的,而是按一个线程的连续性和身份来定义”。
所以实体有一个id属性存入数据库中。
一个实体通常映射成关系型数据库的一个表。
继承FullAuditedEntity<Guid>:主键类型为Guid类型的全审计实体(软删除,记录删除时间和删除人员等信息)(必要)IPassivabile:信息状态接口(必要)IMustHaveTenant:必要性租户字段接口(必要)IMenuID:栏目ID接口(必要)INeedAuxiliaryId:辅助ID接口(辅助ID为long类字段)(必要)ILanguage:语言接口(必要)IAutoSynchronous:数据同步接口(非必要)ISynchronousSource:数据同步源接口(非必要)常量:字段长度限制规范:定义字段的限制3.1.2领域服务领域服务(或服务)用来执行领域操作和业务规则。
Eric Evans描述一个好的服务需要三个特点(在他的DDD书里):操作与领域概念(不是一个实体或值对象天生的一部分)相关。
接口要按照领域模型的其它元素来定义。
操作是无状态的。
与应用服务获取/返回DTO(数据传输对象)不同,领域服务获取/返回领域对象(如实体或值类型)。
领域服务可被应用服务或其它领域服务调用,但不直接被展现层(应用服务是针对它的)使用。
首先我们要为服务定义一个接口,接口继承IDomainService,接口中的服务包含创建、修改和删除有五个方法。
其次实现服务IDomainService 接口和DomainService 服务ABP定义了IDomainService接口,按约定所有的领域服务都要实现它,实现之后,领域服务被自动暂时的注册到依赖注入系统。
同样,领域服务(随意地)可以从DomainService类继承,因此它可以使用继承得来的日志、本地化、等属性。
即使不继承DomainService类,也可以在需要时注入它。
3.1.3定义模块权限授权系统使用IPermissionChecker来检查许可,虽然你用自己的方式实现它,不过在module-zero项目里已完全实现。
如果没有实现该接口,会使用NullPermissionChecker,它给每个人授予所有许可。
为每个操作定义的唯一许可必须得到授权,为使用许可要先定义一个,ABP是按模块化设计的,所以不同的模块可以拥有不同的许可,一个模块为了定义它的许可,应当创建一个继承AuthorizationProvider的类。
授权供应器示例如下:第一步:定义权限常量:第二步:定义权限许可第三步:定义许可中displayName的本地化(/Core/Localization/AppPermissions)IPermissionDefinitionContext拥有获取和创建许可的方法。
一个许可包含一些属性:Name:一个系统域内的唯一名称,用一个字符串常量,不用可变的字符串,是一个好的做法。
在分级里我们更喜欢用.(点)号来命名,但它不是必须的,你设置为你喜欢的名称,唯一的规则是一定要唯一。
DisplayName:一个本地化的用来之后在UI上显示许可的文本。
Description:一个本地化的用来之后在UI上显示许可描述的文本。
MultiTenancySides:在多租户应用里,许可可被租户或宿主使用,这是一个标记性的枚举,所以一个许可可同时被租户和宿主使用。
DependedFeature:用来表明一个对Feature(特色)的依赖,所以这个许可只有在满足Feature(特色)依赖时才会被允许。
一个许可可以有一个父许可和多个子许可,虽然这对于许可检查没有什么作用,但可能有助于在UI上组织许可。
第四步:创建一个授权供应器之后,我们应当在我们模块的预初始化方法里注册它,在Core/Common/中注册许可:3.1.4定义模块功能功能系统使用IFeatureValueStore来获取功能的值。
尽管你可以用自己的方式实现它,但在module-zero项目里已经完全实现。
如果它没有被实现,NullFeatureValueStore用来为所有功能返回null(这种情况下使用默认功能值)。
功能的值类型Boolean 类型:可以是“true”或“false”,一个这种类型的功能可以是启用或禁用(为一个版本或一个租户)。
Value 类型:可以是任意值,它保存和获取一个字符串,数字也保存成字符串。
第一步:定义功能常量:第二步:定义常量:在检查功能前,先要定义它,一个模块可通过继承FeatureProvider类来定义自己的功能一个功能定义要求至少两个属性:Name:一个唯一名称(字符串),这个功能的标志。
DefaultValue:一个默认值,当我们需要这个功能的值而又不能从当前租户取得时,我们需要一个默认值。
DisplayName:一个本地化的字符串,为用户显示这个功能的名称。
第三步:定义功能的displayName的本地化(/Core/Localization/AppFeatures)第四步:在创建一个功能供应器之后,我们应当在我们模块()的PreInitialize 方法里注册它(Core/Common/),如下所示:3.1.5更新数据库第一步:定义DbSet(Mt.)第二步:定义表名(Mt.yFramework.HkWebDbModelBuilderExtensions)第三步:执行命令更新数据库打开工具->NuGet包管理器->程序包管理器控制台,重新生成解决方案;然后将默认项目设置为EntityFrameworkCore;最后在控制台中输入Add-Migration“name”(name:不能用重复的名字可以使用“描述+日期”如:createNews)运行之后Migrations文件夹中2070_生成;第四步:更新数据库创建表;在程序包管理器控制台中运行Update-Database命令随后数据库就会新建了一个表3.2应用层应用层包含用于展示层的应用服务。