问答部分
问:
如何修改领域模型?
答:
一般来说我们有两种选择,这两种选择也是两种价值观的体现(乐观和悲观)。
- 第一种:使用UI传递过来的DTO在应用层重建Domain Model,然后执行修改,DTO更多的表达了一种结果。
1 public class Application 2 { 3 public void Update(DTO dto) 4 { 5 var entity = this.AutoMap(dto); 6 7 repository.Update(entity); 8 } 9 }
- 第二种:使用Repository从Database中重建Domain Model,然后使用DTO携带的数据调用Domain Model,DTO更多的表达了一种目的。
1 public class Application 2 { 3 public void Update(DTO dto) 4 { 5 var entity = repository.Load(dto.Id); 6 7 entity.ChagneXXX(dto.XXX); 8 9 repository.Update(entity); 10 } 11 }
备注
两种方式在处理乐观检查和合法性检查上也有所不同。
- 在乐观检查方面:第一种涉及一次Load,乐观版本号的比较可以由ORM帮你完成,第二种涉及两次Load,要手工比较两次Load的版本号是否一致。上图没有画出第一次Load,要修改,UI必须要Load一次的。
- 在合法性检查方面:第一种允许模型处于非法状态,仓储在持久化的时候负责检查,第二种不允许模型处于非法状态,模型自己负责保证这一要求。
如果采用了第一种,DTO和Domain Model可以使用一个类型,可以参考微软的示例:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application。
文中涉及两种重建:从UI重建和从数据库重建,多数情况我们不能信任前者,而可以信任后者。