




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、简介Domain Component组件技术,以下简称DC,是扩展自XPO的,官方不建议新手使用DC。如果你用过EF,XPO及类似的ORM,这是很容易理解的,DC是基于XPO的,只是原来定义ORM对象时用的是类,现在改用接口。然后通过DC上声明的一些Attribute来生成最终的类代码,在运行时编译,最终还是生成了xpo的类。当然接口只是可定义一些结构,方法,属性及一些个性化的逻辑并没有实现,再使用一个Logic类,来做真正的实现。对于一些默认的读写功能的属性,不需要在logic类中实现。DC机制会默认生成一个实现。 可以创建可重用的领域对象:多数情况下,每个XAF中用到的领域对象都不是唯一的,比较常见的对如:人、电话、地址,等领域对象,这些使用频率较高的,想要抽象出来还是有点难度的,这不是一个简单的任务,使用DC这事就简单了。 可以使用多重继承:因为DC是用接口描述的,所以,多继承在C#的语法级别被支持,你可以使用继承以前写过的DC,重用它,并且可以增加新的属性和替换逻辑。事实上,这是我最喜欢的一个特性! 不需要从持久性化基类继承实现领域对象 :最终的执行代码是生成的,这当然很容易实现了。当然,也可以指定基类。注意: 在Medium Trust环境中,DC组件不能使用。 DC组件技术不支持Model First和Database first的方式。我们不推荐使用附加(就是两个或多个)数据库。因此,我们不提供任何手段从现有数据库生成域组件代码和逻辑,我们有没有立即的计划来支持此方案。请试试XPO或实体框架数据模型。 自定义字段不能在设计时添加到域组件。 如果一个DC组件注册为SharePart,不能添加自定义字段。二、DC定义下面的代码片段演示如何定义一个DCDomainComponentpublic interface IPerson string LastName get; set; string FirstName get; set; string FullName get; void Copy(IPerson target);你可以看到,接口上必须使用DomainComponentAttribute来声明接口是个DC.接口的属性就是将来出来表的字段.在普通BO定义中使用的一些Attribute现在仍可用.例如你可以给LastName上面加上RuleRequiredFieldAttribute, 给接口上加上NavigationItemAttribute.FullName被定义为只读的.它需要在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(Person, typeof(IPerson);上面的注册中,并没有指定基类,所以将会默认使用DCBaseObject做为基类,如果要指定基类,可以看下RegisterEntity的其它重载方法。四、Domain Logic每个DC可以有一(零)个或多个Domain Logic. Domain Logic 是一个普通的类,加上了DomainLogicAttribute标记, 并指定DC类型. 其实再多的话都没有一个代码实例有用:DomainLogic(typeof(IPerson) /必须写个,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); public static void Copy(IPerson person, IPerson target) /实现了上面定义的Copy方法,但是,注意,第一个参数,在接口中并没有定义,但在这里却可以出现,也可以不出现,调用时会被自动替换为当前对象 if(target != null) target.FirstName = person.FirstName; target.LastName = person.LastName; 上面的示例中,还可以看到,Get_FullName是非静态的,Copy是静态的,事实上,是不是静态的都没有关系,都会被调用,当然,你可以想像一下,静态方法是不需要实例化对象的。将来被调用时,是不会实例化PersonLogic这个类的。否则就会实例化。当然,类中一个非静态方法都没有时,才会不实例化logic类。那么,DC中的语法到底有多少呢?说明示例Get_属性名称当property的get被调用时,就执行这个方法。如果属性是只有get或,非持久化时,才可以实现这个,否则都自动实现。public static stringGet_FullName(IMyInterfaceinstance)public static stringGet_FullName(IMyInterfaceinstance, IObjectSpaceobjectSpace)Set_属性名当property的set被调用时,就执行这个方法。属性必须不能是只读的,即,DC中声明了set,使用这个方法实现非持久化属性。public static voidSet_FullName(IMyInterfaceinstance, stringvalue)public static voidSet_FullName(IMyInterfaceinstance, IObjectSpaceobjectSpace, stringvalue)BeforeChange_属性名当属性被设置新值之前被调用属性必须是非只读的。public static voidBeforeChange_FirstName(IMyInterfaceinstance, stringvalue)public static voidBeforeChange_FirstName(IMyInterfaceinstance, IObjectSpaceobjectSpace, stringvalue)AfterChange_属性名当属性被设置新值之后被调用.非只读属性可用.public static voidAfterChange_FirstName(IMyInterfaceinstance)public static voidAfterChange_FirstName(IMyInterfaceinstance, IObjectSpaceobjectSpace)方法名称接口上定义了一个方法定义,那个方法被调用时,执行此处的逻辑。接口上要是没定义这个方法,那它就是普通方法了。public static voidCalculateSalary(IMyInterface instance, intamount, intprice)public static voidCalculateSalary(IMyInterface instance, IObjectSpaceobjectSpace, intamount, intprice)AfterConstructionBo中有也有这个,就是新建对象完成后,可以在这里写一些初始化属性值的操作。public static voidAfterConstruction(IMyInterfaceinstance)public static voidAfterConstruction(IMyInterfaceinstance, IObjectSpaceobjectSpace)OnDeletingBo中也有这个,当删除时执行。public static voidOnDeleting(IMyInterfaceinstance)public static voidOnDeleting(IMyInterfaceinstance, IObjectSpaceobjectSpace)OnDeletedBo中有,删除后执行。public static voidOnDeleted(IMyInterfaceinstance)public static voidOnDeleted(IMyInterfaceinstance, IObjectSpaceobjectSpace)OnSavingBo中有也有这个,保存中执行。public static voidOnSaving(IMyInterfaceinstance)public static voidOnSaving(IMyInterfaceinstance, IObjectSpaceobjectSpace)OnSavedBo中有也有这个,保存完成执行。public static voidOnSaved(IMyInterfaceinstance)public static voidOnSaved(IMyInterfaceinstance, IObjectSpaceobjectSpace)OnLoadedBo中有也有这个,已经的对象,被加载后执行。public static voidOnLoaded(IMyInterfaceinstance)public static voidOnLoaded(IMyInterfaceinstance, IObjectSpaceobjectSpace)上面的方法,必须是静态或是非静态的,必须为public,参数的定义可以是以下几种情况: LogicMethodName(source_parameters)与DC中定义的方法是一致的。 LogicMethodName(target_interface,source_parameters)当前DC类型,指当前对象和接口中定义的那些参数. LogicMethodName(target_interface,object_space,source_parameters)与上面的相对,多了一个object_space,用过xpo+xaf的同学一看就懂了,就是指当前对象用的objectspace,因为有时我们需要使用objectspace进行一些crud操作.五、示例:之前的Logic你看起来可能感觉有点麻烦,下面来看看一种简写方法:DomainComponentpublic interface IPerson string FirstName get; set; NonPersistentDc string FullName get; set; DomainLogic(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 string 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) person.Address = objectSpace.CreateObject(); 下面来看看重写别的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_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中的定义,相当于bo中的override return client.ClientID; 下面演示了如何为collection属性返回值:DomainComponentpublic interface IOrder NonPersistentDc IList OrderLines get; DomainLogic(typeof(IOrder)public class OrderLogic public IList Get_OrderLines(IOrder order) /. 下面的IUser并不是一个DC定义(没用DomainComponent来定义,这时,必须在逻辑中为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方法来注册,你也可以通过ITypesInfo.RegisterDomainLogic和ITypesInfo.UnregisterDomainLogic的方法手动注册逻辑,当你不能访问DC Logic类来源,但需要操作DC逻辑分配时这很有用。六、一对多和多对多关系的定义在DC中,你不需要使用Association来定义一对多和多对多关系.下面的代码片段演示了如何定义订单与订单明细关系.DomainComponentpublic interface IOrder IList Items get; DomainComponentpublic interface IOrderItem IOrder Order get; set; 下面是多对多关系:DomainComponentpublic interface IEmployee IList Tasks get; DomainComponentpublic interface ITask IList Employees get; 你可以只定义一端的属性,比如,IEmplyee.Tasks,另一端的,将会自动生成。当然在XAF的界面中,ITask.Employees将不会被显示出来。下面的情况时,生成器不知道该如何生成代码,所以需要BackReferenceProperty来指定对方的属性:DomainComponentpublic interface IAccount BackReferenceProperty(AccountOne) IList ContactA get; BackReferenceProperty(AccountTwo) IList ContactB get; IList 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 interface IWorker DomainComponentpublic interface
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第2节 电流说课稿-2025-2026学年初中物理沪科版五四学制2024九年级上册-沪科版五四学制2024
- 第四节 生物学的研究工具说课稿
- Lesson 11 Is this your shirt说课稿-2025-2026学年初中英语第一册 上半册新概念英语
- 第12课 语音合成技术教学设计-2025-2026学年初中信息技术浙教版2020八年级下册-浙教版2020
- 2025年四川省眉山市中考生物试题及答案
- 苏少版一年级音乐上册(简谱)第4单元《唱:不能告诉你》教学设计
- 小学二年段期末考试试卷(2篇)
- 2025年《现代咨询方法与实务》知识考试题库
- 2025年高考数学试题分类汇编:等式不等式试卷+解析
- 2025年暑假高二升高三化学专项复习:阿伏加德罗常数的判断(含答案)
- 幼儿园大班美术活动《三原色-加色法原理》
- 种植牙二期修复
- EXCEL表格数据的统计分析课件
- 《建筑法律知识》课件
- 《快消品行业分析》课件
- 印刷服务投标方案(技术方案)
- 医疗器械经营质量管理制度、工作程序文件目录
- 美国RAZ分级读物目录整理
- 2019电力建设施工质量验收规程第6部分:调整试验
- (完整版)高标准农田建设施工组织设计
- 物体打击事故预防安全培训课件
评论
0/150
提交评论