posted @ 2005-07-04 18:21 编写人生 阅读(637) 评论(3)
编辑
关于O/R中数据绑定功能的支持
要实现完整的数据绑定功能,工作量还是很大的。
(以下提供的类如未特别表明,均来自System.ComponentModel)
1、设计时,控件如何知道我的载体有多少字段?
.NET Framework通过对象TypeDescriptor的GetProperties方法获取单个对象公开属性的列表,列表的项目类型是PropertyDescriptor,他和System.Reflection.PropertyInfo有些相近,用来描述你的属性是什么样的。
但注意的是,我们知道DataTable在MS设计好后,就固定那几个属性,问题是我们绑定的是其中的字段,而不是他的什么TableName属性,MS为什么可以搞特殊化呢?这里通过ICustomTypeDescriptor接口实现的(是DataRowView实现的,具体原因下面再说),TypeDescriptor的GetProperties内部执行时,会检测你的对象是否支持ICustomTypeDescriptor,如果支持将作为优先输出结果。
备注:TypeDescriptor的GetProperties工作时,还会考虑是否是COM接口的。
2、我如何告诉表格我的集合中存储的明细类型?
我在绑定一个DataTable时,表格控件自动就知道有多少列,而我自定义的集合类,他如何知道明细的类型,以便决定显示多少列?
优先级最高的是你的集合支持ITypedList,这个接口表明了你的集合明细的属性列表;
如果你的集合有个强类型的Item(C#叫this索引),这样也是可以的。
3、我的集合绑定到表格时编辑功能没有dataset的强大?
例如dataset绑定后可以排序等功能,而我的为什么不可以(可以也行),这个原因是你的集合是否完整支持IBindingList,他定义了丰富的集合编辑特性;
另外让你的实体(非集合)支持IEditableObject将可以在编辑改动取消掉。
4、DataSet可以设置一个错误信息,然后我的绑定控件后面就一个感叹号在闪烁,我如何能够做到?
这需要你的实体支持IDataErrorInfo,以便获得此功能。
5、你说的那么多接口,但我没有看见DataTable、DataSet支持这些接口啊,你是不是讲错了?
你没有说错,我也没有完全说错,MS的做法讲绑定的实现从DataTable、DataSet和DataRow中移动到DataView、DataViewManager和DataRowView中,这样做到职能更加清晰。
他通过IListSource来转移这种绑定,使控件实际绑定到这些View中。
以上仅是简单介绍,具体还很复杂。
目前我所看见的绝大多数OR设计没有考虑绑定机制。
posted @ 2005-07-04 18:15 编写人生 阅读(1313) 评论(2)
编辑
首先解释什么叫“实体类和操作类的分离”?
实体,我原先称载体,我觉得这样更加贴切一些,顾名思义是承载数据的对象,我们看见的DataSet就是这个冬冬;
操作类,专业称呼好像叫什么“领域模型”什么的(我是土包子一个,不懂那么多专业术语),就是对实际数据库的操作,最常见的就是CRUD操作了。
那么不分离的设计是什么样的呢?ADO(COM时代的ADO)就是不分离的设计,他重要的对象Recordset就包含了AddNew,Update等对数据库的操作,又包含了Fields集合用来检索记录中的数据,其实这种设计还包括Java中的EJB以及XPO ;
分离的对象设计最经典的就是ADO.NET,DataSet是实体,用来承载数据,他不负责任何的对数据库的操作,而具体的操作分配给Command。PDO、
Grove.NET 、ObjectSpaces都是这样的设计思想。
为什么分离?
1、MS在解释ADO的“升级”目的时,就说了是为了更好的做分布式开发,因为分布式开发需要将实体传输到客户端,而如果实体包含了Save之类的方法,那将是多么糟糕的设计(虽然实际上是不能Save的);
2、实体的独立,这可以使职能更加清晰,这样可以方便的实现剪贴板、序列化、回收站等等功能,因为我不再关心实体是否一定是存在数据库中,可以是文件、序列化后的一个字段或者一个流中。
3、说一个赖皮的理由

:不分离的设计都是早期的设计,后设计的都是分离的。
posted @ 2005-07-04 12:57 编写人生 阅读(2323) 评论(3)
编辑