我想在我的.NET核心域模型中实现DDD模式。 以下是具有聚合子实体的聚合根以及聚合孙实体的示例:
public List<String> generateParenthesis(int n) {
List<String> result = new LinkedList<String>();
Generate("", 0, 0, n, result);
return result;
}
private void Generate(String s, int l, int r, int n, List<String> result){
if(l == n && r == n){
result.add(s);
return;
}
if(l<n){
Generate(s+"(", l+1, r, n, result);
}
if(r < l)
Generate(s+")", l , r+1, n, result);
}}
这里是Aggregate Child的代码:
public class Supplier
: Entity, IAggregateRoot
{
private string _name;
private readonly List<Catalog> _catalogs;
public IReadOnlyCollection<Catalog> Catalogs => _catalogs;
protected Supplier() { _catalogs = new List<Catalog>(); }
public Supplier(string name)
{
_catalogs = new List<Catalog>();
_name = name;
}
public void AddCatalog(string name)
{
var catalog = new Catalog(name);
_catalogs.Add(catalog);
}
public void AddCatalogItem(int catalogId, string name)
{
var catalogItem = new CatalogItem(name);
_catalogs.Single(c => c.Id == catalogId).AddCatalogItem(catalogItem);
}
}
聚合孙子:
public class Catalog
: Entity
{
private string _name;
private readonly List<CatalogItem> _catalogItems;
public IReadOnlyCollection<CatalogItem> CatalogItems => _catalogItems;
protected Catalog() { _catalogItems = new List<CatalogItem>(); }
public Catalog(string name)
{
_catalogItems = new List<CatalogItem>();
_name = name;
}
public void AddCatalogItem(CatalogItem catalogItem)
{
_catalogItems.Add(catalogItem);
}
}
这是完成DDD模式的正确方法吗? 或者这会破坏我不知道的DDD规则吗?
答案 0 :(得分:4)
它本身并没有破坏任何DDD 规则 - 但这种方法通常是不鼓励的,原因如下:
所以 - 如果你没有任何这样的规则,并且你已经被说服创造了小小的&#39;聚合,你能做什么?
这种方法的含义是,不在整个聚合中具有事务一致性 - 但除非您的规则要求它,否则您不需要它,那么为什么要强制执行呢?
DDD鼓励的另一条建议是挑战对交易一致性的要求 - 它真的有必要吗?
使用上面的简单示例 - 如果供应商最终获得了5个目录,会发生什么?世界会破裂吗?即使您确实需要该规则,它是否需要在事务上保持一致?使用较小的聚合,您可以:
建议如下: