ABP 框架实战系列(二)- 畛域层介绍篇

EF Core 全称是Entity Framework Core,可应用 EF Core 开发面向 .NET Core 的利用,EF Core 同时反对在 Visual StudioVisual Studio for Mac 或 Visual Studio Code 等环境下开发。

若有敌人对EF Core不是很相熟,能够通过篇文章理解一下EF Core 疾速入门教程,在此就不反复介绍了,该公众号举荐关注,知识点满满。

EF Core 之所以在ABP模板中特地抽出来,并不是因为这里的EF Core 有何特别之处,而是这里的EF Core 对畛域对象负责。

ABP框架架构介绍中有提到 ABP 不仅仅是一个架构,它还是提供了一个最佳实际的基于畛域驱动设计(DDD)的体系结构模型。

如下图所示,ABP在应用层和长久化层两头,有一个畛域层.

畛域层概述

畛域驱动设计(DDD):DDD本来定义为一种软件开发的解决方案,始于对立语言,经由绑定上下文,最终失去一个以业务模型对象为核心的分层架构。遵循DDD的准则,常见的开发步骤:理解需要、把需要转化为标准、理论编码以及测试。DDD的目标是应酬业务畛域的外围简单行。然而,应用DDD须要建设在对业务畛域的精准把握之上。正确得应用DDD会是软件的开发施行变得非常简单

畛域层的构造大抵如下

畛域层的外部

  • 畛域模型

    • 模块
    • 值对象

      DDD畛域模型蕴含实体和值对象。值对象齐全通过它的个性来定义。值对象的个性在实例创立之后就不会扭转了。如果要改同时变,值对象会变成另一个值对象的实例

    • 实体Entity Class

      实体是从实体类派生的
      所有对象都有个性,但不是所有的对象都能齐全通过它们的个性汇合来标识。这些对象就是实体。换句话说,如果对象须要一个ID个性在整个生命周期的上下文里惟一跟踪它,这个对象就有一个身份标识,且被看成实体。值对象只是聚合在一起的数据,实体通常由数据和行为形成。行为是区别对待畛域逻辑和利用程序逻辑的要害。畛域逻辑在畛域层中,用例的实现则在应用程序里

      public class Person : Entity{    public virtual string Name { get; set; }    public virtual DateTime CreationTime { get; set; }    public Person()    {        CreationTime = DateTime.Now;    }}

      人员类定义为一个实体。它有两个属性。此外,实体类定义id属性。它是实体的主键。因而,所有实体的主键名称雷同,它是id。

      id(主键)的类型能够更改。这是int(Int32)默认。如果要将另一类型定义为id,则应显式申明如下所示:

        public class Person : Entity<long>  {      public virtual string Name { get; set; }      public virtual DateTime CreationTime { get; set; }      public Person()      {          CreationTime = DateTime.Now;      }  }
    • 实体长久化

      畛域模型必须长久化,然而,它不关怀长久化。畛域模型的实现里没有波及加载和保留的操作。然而长久化操作对于一个应用程序时必不可少的局部。这时,由仓储负责这些工作。仓储通常都是在畛域模型之外应用,比方应用程序层、畛域服务。然而,仓储的契约在畛域层,它的实现在基础设施层理。

  • 聚合

当开发者依据需要里的用例为绑定上下文构建畛域模型,你会发现一些单个实体总是相互援用。逻辑上相干的对象被独自看待而不是组合起来且被当作一个整体看待很容易导致数据泥团代码。这时能够通过聚合对模型里的实体进行分组和隔离。通常的做法是先把畛域模型分解成聚合,而后在聚合里标识出畛域实体。

    • 长处

      • 业务逻辑变得更加简略
      • 避免紧耦合模型
    • 关系

      聚合的根类对调用方暗藏了相干的类,且要求调用方在进行任何交互时援用它们。换句话说,一个实体只容许援用同一个聚合的实体或者另一个实体的根。当一个聚合须要援用多个另一个聚合中非跟类的实体,该聚合应该援用另一个聚合的根实体。

    • 创立

      聚合根对象是组成这个聚合的对象群的根。聚合根在整个畛域模型都可见,且能够间接援用。聚合里的实体任有它们的身份标识和生命周期,然而它们不能从聚合之前间接援用。聚合根也有相应的责任:

      • 聚合根保障聚合内的对象总是依照应用程序iyewu规定无效状态
      • 聚合根负责长久化所有被封装的对象
      • 聚合根负责级联更新以及删除聚合里的实体
      • 查问操作只能获取聚合根。
    • 畛域服务

      畛域服务类的办法实现的畛域逻辑不属于特定聚合,且可能逾越多个实体。为了实现业务操作,畛域服务协调聚合和仓储的流动。在某些时候,畛域服务可能应用基础设施服务,比方发送电子邮件或者短信

      • 服务即契约
      • 跨聚合行为
      • 仓储
    • 畛域事件

      畛域事件用于在某些畛域事件产生时触发一个事件。这样能够防止在同一个中央搁置所有解决代码。

      • 开发人员能够在不触碰产生事件的代码的状况下动静定义一组处理器
      • 能够在多个中央触发雷同的事件

    ## 博主GitHub地址
    https://github.com/yuyue5945

    关注公众号留下您的困惑或见解