下面按照DDD分层架构进行说明:
- 用户界面层
- 应用层
- 领域层
- 基础设施层
将各个层都会用到的类归到其他的类命名规范中。
类型 | 说明 | 建议命名 | 示例 |
---|---|---|---|
控制器(Controller) | MVC控制器 | XXXController | TransferController |
类型 | 说明 | 建议命名 | 示例 |
---|---|---|---|
应用服务类(Application Service) | 封装了技术逻辑,协调者,调用领域层,本身不负责业务逻辑。与领域服务类(Domain Service)同名时,通过类路径来区分。 | XXXService | FundsTransferService |
类型 | 说明 | 建议命名 | 示例 |
---|---|---|---|
实体(Entity) | 名词 | XXX | Account BrokderageAccount Customer Order Invoice Cargo |
值对象(Value Object) | 名词 | XXX | Address SalesContact Role |
策略(Policy) | 业务惯例,约束 | XXXPolicy | OverbookingPolicy |
规格(Specification) | 用于表达特定类型的规则,用来替代条件逻辑,比如“拖欠票据规格”用来验证票据是否拖欠,“大额票据规格”用来判断票据是否为大额票据。参见规格模式。 | XXXSpecification | DelinquentInvoiceSpecification BigInvoiceSpecification RouteSpecification |
领域服务(Domian Service) | 封装不属于任何实体/跨实体和值对象的业务逻辑 | XXXService | RoutingService |
领域事件类(Event) | 领域事件 | XXXEvent/过去式 | HandlingEvent BacklogItemCommited |
存储库(Repository) | 数据读写 | XXXRepository | InvoiceRepository TradeOrderRepository CargoRepository |
工厂类(Factory) | 创建某种对象的工厂 | XXXFactory | BrokerageAcccountFactory |
原来我将 Repository 放到了基础设施层,将 Factory 放到了其它,但是出于业务逻辑内聚的考虑,还是应该将 Repository 和 Factory 放到领域层比较合适。当然非业务逻辑的 Factory 也可以归到其它。
类型 | 说明 | 建议命名 | 示例 |
---|---|---|---|
基础设施服务(Infrastructure Service) | 提供基础设施服务。与领域服务类(Domain Service)同名时,通过类路径来区分。 | XXXService | MailService SMSService |
类型 | 说明 | 建议命名 | 示例 |
---|---|---|---|
助手类(Helper) | 帮助完成某类操作的工具类 | XXXHelper | |
工具类(Utils) | 工具类 | XXXUtils | |
数据传输对象(DTO,Data Transfer Object) | 用来在各层之间传递数据的对象,不包含逻辑。 | XXXDTO | |
视图对象(VO,View Object) | View Object本质也是一种Data Transfer Object,只不过是用在用户界面层向应用层传递数据。注意,不要和DDD的Value Object值对象搞混了。 | XXXVO | |
持久化对象(PO,Persistence Object) | 用来持久化数据的对象,比如对关系数据库而言一个Persistence Object可能是JPA Entity对象。需要权衡是直接使用DDD Entity来作持久化,还是复制到一个新的JPA Entity中作持久化。 | XXXPO |
领域对象(DO,Domain Object,包含Entity和Value Object) 是否直接用在界面展示和数据持久化,还是需要复制并转换成View Object再在界面展示,或转换成Persistence Object再作数据持久化需要权衡。需要考虑:
- 是否泄漏了不应该暴露的数据 (安全问题)
- 是否读取或传输了过多的数据(性能问题)
- 是否需要的是合并或处理后的数据(数据问题)
- 对象复制的成本(性能问题)