DDD:域和持久性的单独模型

时间:2018-03-21 07:05:00

标签: domain-driven-design

假设我们有域和持久性的单独模型,一个域模型存储为两个持久性模型,如下所示。

class DomainEntity {
    property1;
    property2;
} 

class PersistenceEntity1 {
    domainProperty1;
    appProperty1;
}

class PersistenceEntity2 {
    domainPproperty2;
    appProperty2;
}

如果您看到模型,则持久性模型中存在一些不属于域模型的额外应用程序属性,例如: modifiedOn,modifiedBy等......

现在我的问题是如何将这些值传递给基础架构层,因为Repository接口也属于Domain层,我们无法将这些属性添加到其签名中。

1 个答案:

答案 0 :(得分:2)

可以从基础结构添加不属于域的其他属性,例如从Repository实现添加。通过这种方式,域名仍然不受基础设施问题的影响。

Repository实现可以从注入的服务中获取该数据。例如,如果持久性模型需要将当前的Authenticated用户ID存储在modifiedBy中,则应将AuthenticatedUserService注入到Repository实现中。

一个更简单的示例是modifiedOn,可以设置为当前系统日期,无需任何服务注入。

作为伪代码:

// Domain layer
class DomainEntity {
    property1;
    property2;
} 

// Infrastructure layer

class PersistenceEntity1 {
    domainProperty1;
    Date modifiedOn;
}

class PersistenceEntity2 {
    domainPproperty2;
    UserId modifiedBy;
}


class Repository {
    // dependency injection
    constructor(AuthenticatedUserService auth){ 
        this.auth = auth;
    }

    function save(DomainEntity d) {
       PersistenceEntity1 p1 = new PersistenceEntity1(d.property1, Date.current() );

       PersistenceEntity2 p21 = new PersistenceEntity1(d.property1, this.auth.getAuthenticatedUserId() );

       db1.save(p1);
       db2.save(p2);
    }
}