我似乎对整个 DDD\LinqToSql 业务感到有点困惑。我正在使用 POCOS 和 linq to sql 构建一个系统,并且我有聚合根的存储库。
因此,例如,如果您有 Order->OrderLine 类,那么您就有了 Order 的存储库,但没有 OrderLine,因为 Order 是聚合的根。存储库有删除Order的delete方法,但是如何删除OrderLines呢?
您可能认为您有一个名为RemoveOrderLine 的Order 方法,该方法从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!
}
}
我很想知道其他人做了什么,因为我不能是唯一一个为此苦苦挣扎的人……我希望……谢谢
您可以在订单上调用RemoveOrderLine,从而调用相关逻辑。这不包括对其持久版本进行更改。
稍后,您在存储库上调用保存/更新方法,该方法接收修改后的订单。具体的挑战在于了解域对象中发生了什么变化,其中有几个选项(我确信比我列出的要多):
- 让域对象跟踪更改,其中包括跟踪需要从订单行中删除 x 的情况。类似于实体跟踪的东西也可能被排除在外。
- 加载持久版本。在存储库中拥有可识别持久版本和内存版本之间差异的代码,并运行更改。
- 加载持久版本。在根聚合中包含代码,可以让您了解给定原始根聚合的差异。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)