总和&聚合根

时间:2014-09-02 14:18:55

标签: c# design-patterns repository domain-driven-design cqrs

我目前正在尝试定义某些基类&在DDD&中使用它们的接口CQRS项目,但我正在努力解决聚合聚合根的定义。

蓝皮书告诉我们......

  • 聚合对象群集
  • 每个聚合都有聚合根
  • 聚合根是特定的实体,是应用程序其他部分可以引用的唯一对象。

为此,我制作了以下类/接口:

实体

public interface IEntity<TKey> {

    TKey Key { get; set; }

}

public abstract class EntityBase<TKey> : IEntity<TKey> {

    // key stuff, equality comparer..

}

聚合根

public interface IAggregateRoot<TKey> : IEntity<TKey>
{
}

存储库

public interface IRepository<TAggregate, TRoot, TKey>
    where TAggregate : IAggregate<TRoot>
    where TRoot : IAggregateRoot<TKey>
{

    TRoot Root { get; set; }

    void Add(TAggregate aggregate);

}

现在,我是否理解正确?那么聚合界面怎么样呢?

public interface IAggregate<TRoot, TKey>
    where TRoot : IAggregateRoot<TKey>
{

}

我试图找到一些参考文献,在CQRS框架中,我发现了以下实现:( CQRS与DDD有很大不同吗?我认为在不应用事件采购时它几乎相同)

public abstract class Entity<TAggregateRoot> where TAggregateRoot
    : AggregateRoot
{

}

1 个答案:

答案 0 :(得分:1)

聚合根只是一个实体,您无需明确定义整个聚合。 Aggregate是对象(实体和值)的层次结构,可以通过聚合根来解决。

因此,根据您对IEntityEntityBaseIAggregateRoot的定义,我认为:

<强>存储库

public interface IRepository<TAggregateRoot, TKey>
    where TAggregateRoot : IAggregateRoot<TKey>
{

    TAggregateRoot Get(TKey id);

    void Delete(TAggregateRoot aggregateRoot);

    void Add(TAggregateRoot aggregateRoot);

}

汇总根实体

public abstract class AggregateRootEntityBase<TKey>
: EntityBase<TKey>, IAggregateRoot<TKey>
{

}

IAggregate<TRoot, TKey>explicit TRootEntity<TAggregateRoot>等构造无需实现。

另外,请不要过度概括并保持简单。在大多数应用程序中,您只需为IAggregateRoot实现一个非通用接口,为Entity实现一个基类或接口