我们已知初始化业务对象的默认值有两种方法,使用XPO框架和实体框架。在上一篇中已说明了XPO,接下来说明使用实体框架。例子和代码与上一篇区别不大。
将实现联系人(Contact)业务类,创建对象后,将使用默认值初始化对象。
由上图我们可以知道,我们需要初始化的属性包括:
简单属性(名字(First Name)、尊称(Title Of Country))
引用属性(地址1(Address1)、经理(Manager))
集合属性(电话(Phone Numbers))
在接下来的文章中会一一举例。
注:官方Demo详见参考网址。
简单属性
可以在业务类中继承IXafEntityObject接口,然后使用该接口声明的IXafEntityObject.OnCreated来初始化业务对象。OnCreated()方法在对象创建后只调用一次,因此很适合用于初始化对象。下面是简单的代码示例——初始化联系人名字(FirstName)、尊称(TitleOfCourtesy)。
1 public class Contact : Person, IXafEntityObject { 2 //... 3 //初始化方法 4 void IXafEntityObject.OnCreated() { 5 FirstName = "Sam"; //名字 6 TitleOfCourtesy = TitleOfCourtesy.Mr; //尊称 7 } 8 void IXafEntityObject.OnLoaded() { } 9 void IXafEntityObject.OnSaving() { } 10 }
引用属性
引用属性也在OnCreated方法中初始化。与简单属性不同的是,需要获得现有对象。因此, 使用到FindObject方法。以下为简单代码示例——初始化地址(Address1)和经理(Manager)。
1 public class Contact : Person, IXafEntityObject, IObjectSpaceLink { 2 //... 3 void IXafEntityObject.OnCreated() { 4 // ... 5 Address1 = objectSpace.CreateObject<Address>(); 6 Address1.Country = objectSpace.FindObject<Country>(CriteriaOperator.Parse("Name = 'USA'")); 7 if (Address1.Country == null) { 8 Address1.Country = objectSpace.CreateObject<Country>(); 9 Address1.Country.Name = "USA"; 10 } 11 Manager = objectSpace.FindObject<Contact>( 12 CriteriaOperator.Parse("FirstName = 'John' && LastName = 'Doe'")); 13 } 14 void IXafEntityObject.OnLoaded() { } 15 void IXafEntityObject.OnSaving() { } 16 private IObjectSpace objectSpace; 17 IObjectSpace IObjectSpaceLink.ObjectSpace { 18 get { return objectSpace; } 19 set { objectSpace = value; } 20 } 21 }
集合属性
集合属性使用XPCollection.Add方法。以下代码演示如何使用预定义的电话号码填充集。
1 public class Contact : Person, IXafEntityObject, IObjectSpaceLink { 2 //... 3 void IXafEntityObject.OnCreated() { 4 // ... 5 PhoneNumber phone1 = objectSpace.FindObject<PhoneNumber>( 6 CriteriaOperator.Parse("Number = '555-0101'")); 7 PhoneNumber phone2 = objectSpace.FindObject<PhoneNumber>( 8 CriteriaOperator.Parse("Number = '555-0102'")); 9 PhoneNumbers.Add(phone1); 10 PhoneNumbers.Add(phone2); 11 } 12 void IXafEntityObject.OnLoaded() { } 13 void IXafEntityObject.OnSaving() { } 14 private IObjectSpace objectSpace; 15 IObjectSpace IObjectSpaceLink.ObjectSpace { 16 get { return objectSpace; } 17 set { objectSpace = value; } 18 } 19 }
计算属性
略。但关联属性发生改变时,计算属性会自动发生变化。
通过新活动(Action)初始化新创建对象
略。详见https://documentation.devexpress.com/eXpressAppFramework/112912/Task-Based-Help/Actions/How-to-Initialize-an-Object-Created-Using-the-New-Act
用从主对象获取的值初始化子对象的属性
可以在引用主对象的属性的setter中为子对象的属性设置默认值。
1 public class ChildObject : BaseObject { 2 // ... 3 public MasterObject MasterObject { 4 get { return masterObject; } 5 set { 6 bool modified = SetPropertyValue("MasterObject", ref masterObject, value) ; 7 if (!IsLoading && !IsSaving && value != null && modified) { 8 this.SomeProperty = value.DefaultForChildren; 9 } 10 } 11 } 12 }
参考网址
[1]相关博文——初始化业务对象初始化业务对象的默认属性值(一)——使用XPO框架:https://www.cnblogs.com/luyj00436/p/11489169.html
[3] 用XPO中的默认属性值初始化业务对象: https://documentation.devexpress.com/eXpressAppFramework/113258/Task-Based-Help/Business-Model-Design/eXpress-Persistent-Objects-XPO/How-to-Initialize-Business-Objects-with-Default-Property-Values-in-XPO
[4]官方演示代码地址:http://www.devexpress.com/example=T209960
[6] https://documentation.devexpress.com/eXpressAppFramework/112912/Task-Based-Help/Actions/How-to-Initialize-an-Object-Created-Using-the-New-Action