资源库的实现
如何重用资源库的实现,以及如何隔离领域层与基础设施层的持久化实现机制,具体的实现还要取决于开发者对 ORM 框架的选择。Hibernate、MyBatis、jOOQ 或者 Spring Data JPA(当然也包括基于 .NET 的 Entity Framework、NHibernate 或 Castle 等),每种框架自有其设计思想和原则,提供了不同的最佳实践来指导开发人员以更适宜的方式编写持久化实现。当然,在领域驱动设计中,无论选择什么样的 ORM 框架,设计为资源库模式是基本的要求。
在我实现的 payroll-ddd 项目中,尝试在资源库实现中以组合方式重用持久化机制。首先,需要实现一个与聚合根无关的通用聚合 Repository 类:
public class Repository<E extends AggregateRoot, ID extends Identity> {
private Class<E> entityClass;
private EntityManager entityManager;
private TransactionScope transactionScope;
public Repository(Class<E> entityClass, EntityManager entityManager) {
this.entityClass = entityClass;
this.entityManager = entityManager;
this.transactionScope = new TransactionScope(entityManager);
}
public Optional<E> findById(ID id) {
requireEntityManag