什么是DDD?
ABP框架提供了基础设施, 使基于领域驱动设计的开发更易实现.
领域驱动设计(DDD) 是一种通过将实现连接到持续进化的模型来满足复杂需求的软件开发方法.
领域驱动设计的前提是:
- 把项目的主要重点放在核心领域和领域逻辑上
- 把复杂的设计放在领域模型上
- 发起技术专家和领域专家之间的创造性协作,以迭代方式完善解决特定领域问题的概念模型
分层
ABP框架遵循DDD原则和模式去实现分层应用程序模型,该模型由四个基本层组成:
- 表示层: 为用户提供接口. 使用应用层实现与用户交互.
- 应用层: 表示层与领域层的中介,编排业务对象执行特定的应用程序任务. 使用应用程序逻辑实现用例.
- 领域层: 包含业务对象以及业务规则. 是应用程序的核心.
- 基础设施层: 提供通用的技术功能,支持更高的层,主要使用第三方类库.
领域层-实体&聚合根
实体是DDD(Domain Driven Design)中核心概念.Eric Evans是这样描述实体的 "一个没有从其属性,而是通过连续性和身份的线索来定义的对象"
实体通常映射到关系型数据库的表中.
实体类
实体都继承自Entity类,如下所示:
public class Book : Entity{ public string Name { get; set; } public float Price { get; set; }}
如果你不想继承基类Entity,也可以直接实现IEntity接口
Entity类只是用给定的主 键类型 定义了一个Id属性,在上面的示例中是Guid类型.可以是其他类型如string, int, long或其他你需要的类型.
具有Guid主键的实体
如果你的实体Id类型为 Guid,有一些好的实践可以实现:
- 创建一个构造函数,获取ID作为参数传递给基类.如果没有为GUID Id赋值,ABP框架会在保存时设置它,但是在将实体保存到数据库之前最好在实体上有一个有效的Id.
- 如果使用带参数的构造函数创建实体,那么还要创建一个 private 或 protected 构造函数. 当数据库提供程序从数据库读取你的实体时(反序列化时)将使用它.
- 不要使用 Guid.NewGuid() 来设置Id! 在创建实体的代码中**使用IGuidGenerator服务**传递Id参数. IGuidGenerator经过优化可以产生连续的GUID.这对于关系数据库中的聚集索引非常重要.
示例实体:
public class Book : Entity{ public string Name { get; set; } public float Price { get; set; }