Web应用程序开发教程 - 第六章: 作者: 领域层
- Entity Framework Core 做为ORM提供程序.
- MVC / Razor Pages 做为UI框架.
本教程分为以下部分:
- Part 1: 创建服务端
- Part 3: 创建,更新和删除图书
- Part 5: 授权
- Part 6: 作者: 领域层 (本章)
- Part 8: 作者: 应用服务层
下载源码
本教程根据你的UI 和 数据库偏好有多个版本,我们准备了几种可供下载的源码组合:
在前面的章节中, 我们使用 ABP 框架轻松地构建了一些服务;
- 使用 CrudAppService 基类, 而不是为标准的增删改查操作手工开发应用服务.
- 使用 自动完成数据层功能.
对于 “作者” 部分;
- 我们将要展示在需要的情况下, 如何 手工做一些事情.
- 我们将要实现一些 领域驱动设计 (DDD) 最佳实践.
作者实体
- 由
FullAuditedAggregateRoot<Guid>
继承使得实体支持 (指实体被删除时, 它并没有从数据库中被删除, 而只是被标记删除), 实体也具有了 审计 属性. Name
属性的private set
限制从类的外部设置这个属性. 有两种方法设置名字 (两种都进行了验证):- 当新建一个作者时, 通过构造器.
- 使用
ChangeName
方法更新名字.
构造器
和ChangeName
方法的访问级别是internal
, 强制这些方法只能在领域层由AuthorManager
使用. 稍后将对此进行解释.Check
类是一个ABP框架工具类, 用于检查方法参数 (如果参数非法会抛出ArgumentException
).
AuthorConsts
是一个简单的类, 它位于 Acme.BookStore.Domain.Shared
项目的 Authors
命名空间 (文件夹)中:
namespace Acme.BookStore.Authors
{
public static class AuthorConsts
{
}
在 Acme.BookStore.Domain.Shared
项目中创建这个类, 因为 (DTOs) 稍后会再一次用到它.
Author
构造器和 ChangeName
方法的访问级别是 internal
, 所以它们只能在领域层使用. 在 Acme.BookStore.Domain
项目中的 Authors
文件夹 (命名空间)创建 AuthorManager
类:
AuthorManager
强制使用一种可控的方式创建作者和修改作者的名字. 应用层 (后面会介绍) 将会使用这些方法.
两个方法都检查是否存在同名用户, 如果存在, 抛出业务异常 AuthorAlreadyExistsException
, 这个异常定义在 Acme.BookStore.Domain
项目 (Authors
文件夹中):
using Volo.Abp;
namespace Acme.BookStore.Authors
{
public class AuthorAlreadyExistsException : BusinessException
{
public AuthorAlreadyExistsException(string name)
: base(BookStoreDomainErrorCodes.AuthorAlreadyExists)
{
WithData("name", name);
}
}
BusinessException
是一个特殊的异常类型. 在需要时抛出领域相关异常是一个好的实践. ABP框架会自动处理它, 并且它也容易本地化. WithData(...)
方法提供额外的数据给异常对象, 这些数据将会在本地化中或出于其它一些目的被使用.
打开 Acme.BookStore.Domain.Shared
项目中的 BookStoreDomainErrorCodes
并修改为:
"BookStore:00001": "There is already an author with the same name: {name}"
当 AuthorAlreadyExistsException
被抛出, 终端用户将会在UI上看到组织好的错误消息.
IAuthorRepository
AuthorManager
注入了 IAuthorRepository
, 所以我们需要定义它. 在 Acme.BookStore.Domain
项目的 Authors
文件夹 (命名空间) 中创建这个新接口:
IAuthorRepository
扩展了标准IRepository<Author, Guid>
接口, 所以所有的标准 方法对于IAuthorRepository
都是可用的.GetListAsync
用于应用层以获得一个排序的, 经过过滤的作者列表, 显示在UI上.
我们会在下一章实现这个repository.
这一章覆盖了图书管理程序作者相关功能的领域层. 在这一章中创建/更新的文件在下图中被高亮: