namespace Business.DomainModel
{
public interface Root {
}
public partial class Order:Root
{
private Guid _guid;
public Order()
{
_guid = System.Guid.NewGuid();
}
//为根对象设置唯一的Guid;
public Guid GUID
{
get { return _guid; }
}
}
public partial class Person:Root
{
public Person()
{
_guid = System.Guid.NewGuid();
}
//为根对象设置唯一的Guid;
private Guid _guid;
public Guid GUID
{
get { return _guid; }
}
}
}
四、细说Repository
1.概念
Repository是把持久化对象转换成领域模型的一种方式,可用于获取、更新持久对象并管理它们的生命周期。它使应用程序与
持久化技术实现解耦,程序无需受制于使用Oracle还是MySql数据库,也不会受到Hibernate、LINQ、ADO.NET等数据层的约
束,使开发人员可以把注意力集中到领域模型当中。
Repository与传统三层模式的DAL层有点相似,但Repository针对的是每一个根对象来划分边界的。在这个例子当中,Person
与Order都会有对应的PersonRepository、OrderRepository。而OrderItem只是Order的子属性,所以它的插入、更新、删除都
会包含在OrderRepository当中。当多个对象之间建立起联系后,关系将是复杂的,特别是在LINQ里面,程序可以轻易通过
Person的导航属性里获取OrderItem的值,最后很容易使代码变得混乱。所以确立Repository的边界,可以在有效管理每个
Repository的职能。
2.实例说明
注意OrderItem的存取、删除都包含在OrderRepository里面。在获取、修改Order的时候,也会利用“显式加载”
context.Order.Include("OrderItem") 的方法,使OrderItem实现同步更新。而通过PersonRepository.GetPerson(int )获取的
Person对象,它内部的Order属性将是null值,这必须清晰按照领域模型的边界划分的。
当LINQ面世以后,数据的获取变得简单,特别在一些小型的系统开发时,很多人会不自觉地把这种领域模型的分界规则打
破。但随着系统的复杂化,问题就会逐渐呈现。比如当Order对象的属性被更新,使用OrderRepository.Update(Order)更新
数据库后,页面的Person对象未能同步实现更新,在Person与数据库交换数据的时候,Order又被变回旧值。
在混乱的数据层开发中,这种情况非常常见,所以在下会坚持Repository的原则,把Repository的职能清晰按照领域模型划
分。
namespace Business.IRepository
{
public interface IOrderRepository
{
Order GetOrder(int id);