由于本人工作中需要用到DevExpress,并且看了下中文资料很少,便记录下来,方便日后查看。DevExpress的功能是非常强大的,在我初次接触的时候便有这个感觉。这次主要看Unit of Work 吧。
Unit of Work 源自于 Session.
我们先看下他官网上的解释:
http://documentation.devexpress.com/#XPO/CustomDocument2138
1.声明:
1 public class UOWPerson : XPObject 2 { 3 string fName; 4 public UOWPerson(Session session) : base(session) { } 5 public UOWPerson(Session session, string name) : base(session) 6 { 7 this.fName = name; 8 } 9 public string Location { 10 get { return GetPropertyValue<string>("Location"); } 11 set { SetPropertyValue<string>("Location", value); } 12 } 13 public string Name { 14 // We cannot use GetPropertyValue in the getter 15 // below because the fName field is explicitly defined 16 get { return fName; } 17 set { SetPropertyValue<string>("Name", ref fName, value); } 18 } 19 }
如果是对一张表进行增删改查,我们一般是用VS2010的ORM自动生成代码,也就是类似Name的这种声明方式。当然如果是对多表操作的话,还是要先写好存储过程,然后再自动生成代码。
2.使用
1 using(UnitOfWork uow = new UnitOfWork()) { 2 // Create, update or delete objects 3 uow.CommitChanges(); 4 }
一般就是用 CommitChanges() 这个方法,会自动更新你的操作,如果在CommitChanges()之前,uow被disposed的话,那之前的操作都会roll back,也就是说不写进数据库中,是不是相当强大,不需要写一句关于数据库操作方面的。
3.看下Session和Unit Of Work 的区别
1 using(UnitOfWork uow = new UnitOfWork()) { 2 UOWPerson p = new UOWPerson(uow, "Mike"); 3 // p.Save(); when working with a Session 4 5 p = new UOWPerson(uow, "John"); 6 // p.Save(); when working with a Session 7 8 p = new UOWPerson(uow); 9 p.Name = "Bob"; 10 p.Location = "US"; 11 // p.Save(); when working with a Session 12 13 // Save all the changes made 14 uow.CommitChanges(); 15 }
可以看到如果是用Sessin的话,你需要对每一个操作都要进行Save下,但是Unit Of Work只需要最后用CommitChanges()方法,因为Unit of Work包含了一个持续对象的列表,它可以对每个操作都进行跟踪。