Mediar.Framework ----对象mapping
Mediar.Framework ----对象mapping
这个框架放到博客园好多天,反应不是很好,本来不打算更新介绍文章了。但是昨天我更新了一下代码,一天就有200多人下载。那我就再写点东西介绍它的技术实现,希望能够得到高手们的指点。如果能够给初学者带帮助,那将是我最大的满足。
Mediar.framework的对象mapping 功能主要放在model中。model中提供了数据从表转成对象,对象转成表,子对象与表的相互转换,还有祝如数据字典的外键。还有子表子对象的处理。可以说model 的功能非常强大。与model 相关的有4个类,一个是factory , 一个是DataHolder,一个是collection ,一个是CollectionDataHolder.
1 Model
Model 类取名为BizObject,因为它里面有大量的业务逻辑。
1.1 Model 的域:对外公布的是类型是与数据库表里字段相对应的类型,然而内部存贮却用的是数组,使用数据的好处就是可以存贮域的不同的状态。比如用户修改了用数据,然后觉得不是很满意,想取消,就时就需要把原来的数据取出来。那么用户的修改前后的数据是放在哪里呢,在Mediar.framework 是把数据放在数组中。开始接触数组存贮数据的时候,我也不习惯,看上去很麻烦,心想在model 中建一个model 的域不就行了吗?那样当然行,数据是存贮了,还原也没有问题,可是那样不利于域的扩展;通过数组设置域的值,是在基类中实现,可以在里面加入大量的事件,但是界面上看还是非常简洁。
1.2 Model 的域的属性- - UserViewableAttribute 属性当然是为了UI服务。属性主要在如下几个方面有设置:
DisplayIndex 用在gridview 时,显示更的前后;
HeaderText用于显示用于显列的标题;
Format对域进行格式化;
Mask 如果这个域是个Mask域才有作用,用于存贮Mask字符串;
PropertyType在gridview 中列是不同的,而且还可以自己定义,如果需要显示特殊的列需要在这里说明。
比如
[UserViewableAttribute(21, Mediar.CoreBizObject.EPropertyStyle.Calendar)]
public System.DateTime TestDataTime
{ get { return System.DateTime.Now.Date; }
set { } }
这就是一个时间域,在用户点击的时候出弹出来日历千选择。(这也是在博客园里看到的,在这里感谢那位朋友)
1.3 表对象域之间的转换
在数据表转到对象的时候,给数组赋两个值,一个是原对象一个是当前对象.方法是MoveRowToProperties,每个对象都有一个相同的方法。对于 UniqueID,LastUpdatedByUser,LastUpdatedDateTime,RecordVersion由于这四个字段在做表设计的时候是必需的,所以就写在基类中了。从域对象转到表的方法是MovePropertiesToRow,同样在基类中实现了UniqueID,LastUpdatedDateTime,RecordVersion。LastUpdatedByUser要根据每个用户登录的ID,所以要在应用才可以设,但也只需要在一个地方设即可。
2 Collection
集合类在基类中已经实现,每个实体的集合只是对的基类简单的继承,但是一点也不影响他强大的功能。(先前我是把集合类做成了泛型,那天 发现了BindingList还特别写了篇BLOG,修改了两天,快要大功告成时候,ContactCollectionDataHolder里面对象的集合可以不是ContactCollectionDataHolder中对象的集合,这样一来使我前功尽弃,一度再想写一篇:泛型的误用:))
3 Factory
Factory在对象mapping中作用是创建了表。曾经考虚过使用XML文件存贮表信息。但那样又要写许多对XML操作方法,而且还多了许多XML文件,唉,还是直接创建方便!
4 DataHolder
DataHolder主要存贮外键中的值。在表与对象域转换的时候,会把GUID(也是外键表中的主键)存入到表,或者DataHolder中。从DataHolder中取对象时就会根据GUID从数据库中取对应的数据,然后来转成对象。这里可能就有个性能的问题。如果主对象有多个记寻,那么这个DataHolder就需要多次查询数据库,当然查过一次,我就会把它记寻下来,cach存了起来。
在DEMO中CONTACT类中ContactTypeDataHolder 就是。
5 CollectionDataHolder
当然是把集合存起来,主要是用在一对多。在一个对象实体里包函别一个对象集合,主对象实体通过构造注入CollectionDataHolder,而CollectionDataHolder里面的集合可以是主对象的任何子对象集合。使用泛型的时候这里就变的非常复杂。因为整个架构非常紧凑,在这里就需要传入4个不同的类型。然后在model中又只能查询自己。所以最终导入我放弃泛型。
在demo的例子中mPhoneNumbers 就是一个CollectionDataHolder 的例子
6 子对象的处理
子对象在包括从数据库中取,刷新,clone 都需要写动来写。目前我还没有找到使用代码模板生成的好的方法。具体可以看Contact类中。Contact.cs文件中包含部分.有可能会在今后再作详细的介绍
Mediar.Framework --对象mapping
Mediar.Framework--使用反射来声明Remoting wellknown服务
Mediar.Framework -- 业务的实现1(UI的绑定)