我目前正在尝试定义某些基类&在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
{
}
答案 0 :(得分:1)
聚合根只是一个实体,您无需明确定义整个聚合。 Aggregate是对象(实体和值)的层次结构,可以通过聚合根来解决。
因此,根据您对IEntity
,EntityBase
和IAggregateRoot
的定义,我认为:
<强>存储库强>
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 TRoot
,Entity<TAggregateRoot>
等构造无需实现。
另外,请不要过度概括并保持简单。在大多数应用程序中,您只需为IAggregateRoot
实现一个非通用接口,为Entity
实现一个基类或接口。