版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、简介 Domain Component组件技术,以下简称DC,是扩展自XPO的, 官方不建议新手使用DC。如果你用过EF,XPO及类似的ORM,这是很容易理解的,DC是基于XPO的,只是原来定义ORM对象时用的是类,现在改用接口。然后通过DC上声明的一些Attribute来生成最终的类代码,在运行时编译,最终还是生成了xpo的类。 当然接口只是可定义一些结构,方法,属性及一些个性化的逻辑并没有实现,再使用一个Logic类,来做真正的实现。对于一些默认的读写功能的属性,不需要在logic类中实现。DC机制会默认生成一个实现。 · 可以创建可重
2、用的领域对象:多数情况下,每个XAF中用到的领域对象都不是唯一的,比较常见的对如:人、电话、地址,等领域对象,这些使用频率较高的,想要抽象出来还是有点难度的,这不是一个简单的任务,使用DC这事就简单了。· 可以使用多重继承:因为DC是用接口描述的,所以,多继承在C#的语法级别被支持,你可以使用继承以前写过的DC,重用它,并且可以增加新的属性和替换逻辑。事实上,这是我最喜欢的一个特性!· 不需要从持久性化基类继承实现领域对象 :最终的执行代码是生成的,这当然很容易实现了。当然,也可以指定基类。 注意:· 在Medium Trust 环境中,DC组
3、件不能使用。· DC组件技术不支持Model First和Database first的方式。我们不推荐使用附加(就是两个或多个)数据库。因此,我们不提供任何手段从现有数据库生成域组件代码和逻辑,我们有没有立即的计划来支持此方案。请试试 XPO 或实体框架数据模型。· 自定义字段不能在设计时添加到域组件。· 如果一个DC组件注册为SharePart,不能添加自定义字段。 二、DC定义 下面的代码片段演示如何定义一个DCDomainComponentpublic interface IPerson st
4、ring LastName get; set; string FirstName get; set; string FullName get; void Copy(IPerson target);你可以看到,接口上必须使用DomainComponentAttribute 来声明接口是个DC.接口的属性就是将来出来表的字段.在普通BO定义中使用的一些Attribute现在仍可用.例如你可以给LastName 上面加上 RuleRequiredFieldAttribute, 给接口上加上 NavigationItemAttribute. FullN
5、ame 被定义为只读的.它需要在logic类中定义实现.另外Copy方法也必须在logic中实现. 三、注册DC 只有注册了DC后,才会被XAF生成真正的XPO类,下面是注册方法,需要打开Module.cs文件,实override下面的方法: using DevExpress.Persistent.BaseImpl;/ . public override void Setup(XafApplication application) base.Setup(application); XafTypesInfo.Instance.RegisterEntity(
6、"Person", typeof(IPerson); 上面的注册中,并没有指定基类,所以将会默认使用DCBaseObject 做为基类,如果要指定基类,可以看下RegisterEntity的其它重载方法。 四、Domain Logic 每个DC可以有一(零)个或多个Domain Logic. Domain Logic 是一个普通的类,加上了 DomainLogicAttribute 标记, 并指定DC类型. 其实再多的话都没有一个代码实例有用: DomainLogic(typeof(IPers
7、on) /必须写个,IPerson是指为哪个DC的逻辑public class PersonLogic /类别是任意的 public const string FullNameSeparator = " " public string Get_FullName(IPerson person) /Get_XXX Get_是固定的,实现property的get的方法,FullName是属性的名称 return string.Format("012", person.FirstName, FullNameSeparator, person.LastName);
8、 public static void Copy(IPerson person, IPerson target) /实现了上面定义的Copy方法,但是,注意,第一个参数,在接口中并没有定义,但在这里却可以出现,也可以不出现,调用时会被自动替换为当前对象 if(target != null) target.FirstName = person.FirstName; target.LastName = person.LastName; 上面的示例中,还可以看到,Get_FullName是非静态的,Copy是静态的,事实上,是不是静态的都没有关系,都会被调用,当然,你可以想像一下,静态方法是不需要实
9、例化对象的。将来被调用时,是不会实例化PersonLogic这个类的。否则就会实例化。当然,类中一个非静态方法都没有时,才会不实例化logic类。那么,DC中的语法到底有多少呢?说明示例Get_属性名称当property的get被调用时,就执行这个方法。如果属性是只有get或,非持久化时,才可以实现这个,否则都自动实现。public static string Get_FullName(IMyInterface instance)public static string Get_FullName(IMyInterface instance, IObjec
10、tSpace objectSpace)Set_属性名当property的set被调用时,就执行这个方法。属性必须不能是只读的,即,DC中声明了set,使用这个方法实现非持久化属性。public static void Set_FullName(IMyInterface instance, string value)public static void Set_FullName(IMyInterface instance, IObjectSpace objectSpace, string value)BeforeCh
11、ange_属性名当属性被设置新值之前被调用 属性必须是非只读的。public static void BeforeChange_FirstName(IMyInterface instance, string value)public static void BeforeChange_FirstName(IMyInterface instance, IObjectSpace objectSpace, string value)AfterChange_属性名当属性被设置新值之后被调用. 非只读属性可用.pub
12、lic static void AfterChange_FirstName(IMyInterface instance)public static void AfterChange_FirstName(IMyInterface instance, IObjectSpace objectSpace)方法名称接口上定义了一个方法定义,那个方法被调用时,执行此处的逻辑。接口上要是没定义这个方法,那它就是普通方法了。 public static void CalculateSalary(IMyInterface instance,
13、int amount, int price)public static void CalculateSalary(IMyInterface instance, IObjectSpace objectSpace, int amount, int price)AfterConstructionBo中有也有这个,就是新建对象完成后,可以在这里写一些初始化属性值的操作。public static void AfterConstruction(IMyInterface instance)public static void&
14、#160;AfterConstruction(IMyInterface instance, IObjectSpace objectSpace)OnDeletingBo中也有这个,当删除时执行。public static void OnDeleting(IMyInterface instance)public static void OnDeleting(IMyInterface instance, IObjectSpace objectSpace)OnDeletedBo中有,删除后执行。public static void&
15、#160;OnDeleted(IMyInterface instance)public static void OnDeleted(IMyInterface instance, IObjectSpace objectSpace)OnSavingBo中有也有这个,保存中执行。public static void OnSaving(IMyInterface instance)public static void OnSaving(IMyInterface instance, IObjectSpace obje
16、ctSpace)OnSavedBo中有也有这个,保存完成执行。public static void OnSaved(IMyInterface instance)public static void OnSaved(IMyInterface instance, IObjectSpace objectSpace)OnLoadedBo中有也有这个,已经的对象,被加载后执行。public static void OnLoaded(IMyInterface instance)public static void OnLoad
17、ed(IMyInterface instance, IObjectSpace objectSpace) 上面的方法,必须是静态或是非静态的,必须为public,参数的定义可以是以下几种情况:· LogicMethodName(source_parameters)与DC中定义的方法是一致的。· LogicMethodName(target_interface, source_parameters)当前DC类型,指当前对象和接口中定义的那些参数.· LogicMethodName(target_interface,&
18、#160;object_space, source_parameters)与上面的相对,多了一个object_space,用过xpo+xaf的同学一看就懂了,就是指当前对象用的objectspace,因为有时我们需要使用objectspace进行一些crud操作. 五、示例:之前的Logic你看起来可能感觉有点麻烦,下面来看看一种简写方法: DomainComponentpublic interface IPerson string FirstName get; set; NonPersistentDc string FullName get; set; Doma
19、inLogic(typeof(IPerson)public class PersonLogic IPerson person; public PersonLogic(IPerson person) this.person = person; /构造逻辑时就传入了当前对象 /像BO中一样直接写property public string FullName get return person.FirstName; set person.FirstName = value; 下面是静态的实现方法:DomainComponentpublic interface IContact static stri
20、ng Name get; DomainLogic(typeof(IContact)public class ContactLogic public static string Name get return "a constant string" 下面是如何使用ObjectSpace的示例:DomainLogic(typeof(IPerson)public class AdditionalPersonLogic public static void AfterConstruction(IPerson person, IObjectSpace objectSpace) per
21、son.Address = objectSpace.CreateObject<IAddress>(); 下面来看看重写别的DC中定义的逻辑DomainComponentpublic interface IPerson ImmediatePostData string FirstName get; set; ImmediatePostData string LastName get; set; string DisplayName get; DomainLogic(typeof(IPerson)public class IPerson_Logic public string Get_
22、DisplayName(IPerson person) return person.FirstName + " " + person.LastName; DomainComponentpublic interface IClient : IPerson ImmediatePostData string ClientID get; set; DomainLogic(typeof(IClient)public class IClient_Logic public string Get_DisplayName(IClient client) /这里重写了IPerson_Logic
23、中的定义,相当于bo中的override return client.ClientID; 下面演示了如何为collection属性返回值:DomainComponentpublic interface IOrder NonPersistentDc IList<IOrderLine> OrderLines get; DomainLogic(typeof(IOrder)public class OrderLogic public IList<IOrderLine> Get_OrderLines(IOrder order) /. 下面的IUser并不是一个DC定义(没用Dom
24、ainComponent来定义,这时,必须在逻辑中为IsActive和UserName两个属性的实现。否则是不能运行通过的。public interface IUser bool IsActive get; set; string UserName get; DomainComponentpublic interface IPerson : IUser string LastName get; set; string FirstName get; set; 在程序集包含DC组件时,可以通过过 ITypesInfo.RegisterEntity 方法来注册,你也可以通过
25、60;ITypesInfo.RegisterDomainLogic 和 ITypesInfo.UnregisterDomainLogic 的方法手动注册逻辑,当你不能访问DC Logic类来源,但需要操作DC逻辑分配时这很有用。 六、一对多和多对多关系的定义 在DC中,你不需要使用 Association来定义一对多和多对多关系.下面的代码片段演示了如何定义订单与订单明细关系.DomainComponentpublic interface IOrder IList<IOrderItem> Items get;
26、DomainComponentpublic interface IOrderItem IOrder Order get; set; 下面是多对多关系:DomainComponentpublic interface IEmployee IList<ITask> Tasks get; DomainComponentpublic interface ITask IList<IEmployee> Employees get; 你可以只定义一端的属性,比如,IEmplyee.Tasks,另一端的,将会自动生成。当然在XAF的界面中,ITask.Employees将不会被显示出来。
27、下面的情况时,生成器不知道该如何生成代码,所以需要BackReferenceProperty来指定对方的属性:DomainComponentpublic interface IAccount BackReferenceProperty("AccountOne") IList<IContact> ContactA get; BackReferenceProperty("AccountTwo") IList<IContact> ContactB get; IList<IContact> ContactC get; DomainComponentpublic interface IContact string Name get; set; IAccount AccountOne get; set; IAccount AccountTwo get; set; IAccount AccountThree get; set; 七、Shared Parts 当一个DC被几个DC同时继承时,这个DC必须要注册为SharePart,使用ITypesInfo.RegisterSharedPart 方法完成.DomainComponentpublic int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 晋教版七年级地理下册系列测评卷 第八章 认识亚洲
- 第4章 消极领导力
- 第3章 自我意识
- 农业灌溉系统智能化改造对水资源利用效率的影响研究意义
- 报废汽车回收服务指南
- 靶向CD47的肿瘤免疫治疗安全性研究报告
- 2026年资产评估师资产评估基础历2026年真题冲刺试卷
- 2026年资产评估师资格考试试卷及答案解析(资产评估基础)
- 抗心律失常药物临床应用中国专家共识(2026 版)
- 2026年从“五方面人员”中选拔乡镇领导班子成员(考前模拟试题及解析)(甘孜州)
- 2025年Q2(桥式)起重机司机题库考试题(附答案)
- 乡镇卫生院基药培训课件
- GB/T 46082.1-2025气焊设备用安全装置第1部分:阻火器
- 山东省济南市2025年中考物理真题(含答案)
- Python数据可视化之Matplotlib与PyEcharts实践
- 高速消防员安全知识培训课件
- 2025年西安市8中小升初试题及答案
- 重庆市2025年高考真题化学试卷(含答案)
- 《贵州省涉路工程安全技术指南(试行)》
- 江苏苏州2024~2025学年高二下册6月期末考试数学试题含解析
- DB1331∕T 054-2023 雄安新区建筑节能与绿色建筑工程施工质量验收标准
评论
0/150
提交评论