Web应用程序开发教程 - 第六章: 作者: 领域层

    • Entity Framework Core 做为ORM提供程序.
    • MVC / Razor Pages 做为UI框架.

    本教程分为以下部分:

    下载源码

    本教程根据你的UI数据库偏好有多个版本,我们准备了几种可供下载的源码组合:

    在前面的章节中, 我们使用 ABP 框架轻松地构建了一些服务;

    • 使用 CrudAppService 基类, 而不是为标准的增删改查操作手工开发应用服务.
    • 使用 自动完成数据层功能.

    对于 “作者” 部分;

    • 我们将要展示在需要的情况下, 如何 手工做一些事情.
    • 我们将要实现一些 领域驱动设计 (DDD) 最佳实践.

    作者实体

    • FullAuditedAggregateRoot<Guid> 继承使得实体支持 (指实体被删除时, 它并没有从数据库中被删除, 而只是被标记删除), 实体也具有了 审计 属性.
    • Name 属性的 private set 限制从类的外部设置这个属性. 有两种方法设置名字 (两种都进行了验证):
      • 当新建一个作者时, 通过构造器.
      • 使用 ChangeName 方法更新名字.
    • 构造器ChangeName 方法的访问级别是 internal, 强制这些方法只能在领域层由 AuthorManager 使用. 稍后将对此进行解释.
    • Check 类是一个ABP框架工具类, 用于检查方法参数 (如果参数非法会抛出 ArgumentException).

    AuthorConsts 是一个简单的类, 它位于 Acme.BookStore.Domain.Shared 项目的 Authors 命名空间 (文件夹)中:

    1. namespace Acme.BookStore.Authors
    2. {
    3. public static class AuthorConsts
    4. {
    5. }

    Acme.BookStore.Domain.Shared 项目中创建这个类, 因为 (DTOs) 稍后会再一次用到它.

    Author 构造器和 ChangeName 方法的访问级别是 internal, 所以它们只能在领域层使用. 在 Acme.BookStore.Domain 项目中的 Authors 文件夹 (命名空间)创建 AuthorManager 类:

    • AuthorManager 强制使用一种可控的方式创建作者和修改作者的名字. 应用层 (后面会介绍) 将会使用这些方法.

    两个方法都检查是否存在同名用户, 如果存在, 抛出业务异常 AuthorAlreadyExistsException, 这个异常定义在 Acme.BookStore.Domain 项目 (Authors 文件夹中):

    1. using Volo.Abp;
    2. namespace Acme.BookStore.Authors
    3. {
    4. public class AuthorAlreadyExistsException : BusinessException
    5. {
    6. public AuthorAlreadyExistsException(string name)
    7. : base(BookStoreDomainErrorCodes.AuthorAlreadyExists)
    8. {
    9. WithData("name", name);
    10. }
    11. }

    BusinessException 是一个特殊的异常类型. 在需要时抛出领域相关异常是一个好的实践. ABP框架会自动处理它, 并且它也容易本地化. WithData(...) 方法提供额外的数据给异常对象, 这些数据将会在本地化中或出于其它一些目的被使用.

    打开 Acme.BookStore.Domain.Shared 项目中的 BookStoreDomainErrorCodes 并修改为:

    1. "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.

    这一章覆盖了图书管理程序作者相关功能的领域层. 在这一章中创建/更新的文件在下图中被高亮:

    下一章