2009-08-20 46 views

回答

1

(这是在假定使用GUID或一些非数据库生成的主键的情况下编写的) 还有很多锅炉代码(如连接管理等)应该移动到Repository的基类中。 如果订单是聚合根,一个可能应该OrderLineRepo私人向大会

public class OrderRepository : Repository 

{ 
    public void Save(Order order) 
    { 
     if(order.IsDirty) 
     { 
        //sets up connection if required, command and sql 
      ICommand command = BuildCommandForSave(order); 
      command.Execute(); 
      OrderLineRepository orderLineRepo = GetOrderLineRepo(); 
      foreach(OrderLine line in order.OrderLines) 
      { 
       orderLineRepo.Save(line); 
      } 
     } 
    } 
} 

但是我强调的是,这的确是一个简单天真的实现,而且我个人利用像NHibernate的一个ORM我的持久性,如果做DDD作为一个良好的测试持久层的要求是非平凡的

此外,这假定IsDirty函数考虑到儿童 - 我们还需要一种手段,看看订单是新的/编辑,不仅仅是肮脏的

+0

作为一个方面,经常会使用默认的未保存ID值 - 所以当保存被调用时,我们可以看看这个ID值并确定对象是新的还是更新的 – saret 2010-03-03 12:24:54

+1

Re:“一个良好测试的持久层的要求并不重要”。在某些情况下,开发ADO.net持久层是有道理的。对于涉及重要报告的项目,纯粹的ADO.Net或micro-orm是用于CQRS查询方面的“细读模型”的推荐方法。因此,如果您需要将ADO.Net用于查询方面,那么将ADO.net用于命令端也不算什么,特别是如果涉及的遗留数据库不容易映射到模型类。您的答案帮助我将ADO.Net方法与DDD结合在一起。 – 2014-12-30 15:23:12