域驱动设计(Linq to SQL) - 如何删除聚合的部分?

7 domain-driven-design repository-pattern linq-to-sql

我似乎已经陷入了对整个DDD\LinqToSql业务的一点困惑.我正在构建一个使用POCOS和linq到sql的系统,我有聚合根的存储库.因此,例如,如果您有Order-> OrderLine类,则您有Order而不是OrderLine的存储库,因为Order是聚合的根.存储库具有删除订单的删除方法,但是如何删除OrderLines?您可能认为Order上有一个名为RemoveOrderLine的方法,该方法从OrderLines集合中删除了该行,但它还需要从底层的l2s表中删除OrderLine.由于OrderLine没有存储库,您应该怎么做?

也许有专门的公共存储库用于查询域对象实际用于删除聚合内容的根和内部通用存储库?

public class OrderRepository : Repository<Order> {
    public Order GetOrderByWhatever();
}

public class Order {
    public List<OrderLines> Lines {get; set;} //Will return a readonly list
    public RemoveLine(OrderLine line) {
        Lines.Remove(line);
        //************* NOW WHAT? *************//
        //(new Repository<OrderLine>(uow)).Delete(line) Perhaps??
        // But now we have to pass in the UOW and object is not persistent ignorant. AAGH!
    }
}
Run Code Online (Sandbox Code Playgroud)

我很想知道其他人做了什么因为我不能成为唯一一个与此斗争的人....我希望....谢谢

egl*_*ius 2

您可以在订单上调用RemoveOrderLine,从而调用相关逻辑。这不包括对其持久版本进行更改。

稍后,您在存储库上调用保存/更新方法,该方法接收修改后的订单。具体的挑战在于了解域对象中发生了什么变化,其中有几个选项(我确信比我列出的要多):

  • 让域对象跟踪更改,其中包括跟踪需要从订单行中删除 x 的情况。类似于实体跟踪的东西也可能被排除在外。
  • 加载持久版本。存储库中包含可识别持久版本和内存版本之间差异的代码,并运行更改。
  • 加载持久版本。在根聚合中包含代码,可以让您了解给定原始根聚合的差异。