实战 .Net 数据访问层 - 6
2024-07-10 13:03:23
供稿:网友
网站运营seo文章大全提供全面的站长运营经验及seo技术!回到最初的代码1,作者通过daf的不同调用总共得到了5种不同的data entity对象:datatable,dataset,mycustomer,ilist,dbdatareader,奇怪的是,只有第三次调用才返回真正的data entity对象:mycustomer,这不是和上面所说的data entity façade自相矛盾吗?
且慢,下面的代码或许能够说明一些问题:
代码5:def如何表现不同数据类型?
// defbase:提供大部分应用程序所需的基本data entity支持,
// 包括collection,ado.net
[serializable()]
public abstract class defbase : ilist, idictionary
{
public static implicit operator dataset(defbase def)
{
return def._dst;
}
public static implicit operator datatable(defbase def)
{
return def._tbl;
}
public static implicit operator dbdatareader(defbase def)
{
return def._rdr;
}
...
}
上面的defbase说明了四个问题:
(1) 对于继承接口有一定难度的数据类型,如:datatable,dataset,dbdatareader,统统采用implicit operator进行内部数据类型转换,转换后的结果即为data entity的实际数据类型,这样调用比较方便,也容易扩展(例如:本来需要返回datatable,今后可能改为dbdatareader或其它数据类型,此时,data entity / data access的接口都无须改动,调用者也只是改用其它implicit operator进行访问即可得到想要的数据);
(2) 对于继承接口非常方便的数据类型,如:ilist,直接继承接口并实现之(上述的dbdatareader也可以通过继承idatareader实现,但就目前的ado.net 2.0而言,由于实现idatareader的类几乎全部从dbdatareader继承,所以,直接使用implicit operator更为实用)!
(3) 无论上面那种类型,data entity内部都会维护一个指向实际数据成员的对象,该对象反映了数据的真实面目;
(4) 对于只需要暴露基本对象字段的single object,直接使用data entity本身(mycustomer)即可,这种情况,就与我们在o/r mapping中调用data entity时一模一样了!
对于defbase不能解决的问题,就需要具体的应用程序去处理了。例如:考虑到generic因素,defbase暂不支持xml数据存储,开发人员就可以在自己的应用程序中建立customized data entity facade,使其支持xml,然后,具体的data entity class就可以直接从customized data entity façade继承(当然,如果data entity class无须支持xml,也可从defbase继承)并使用其xml支持功能!
上面代码3中的mydef / mycustomer就是为了这个目的而构建出来,既使用了framework的功能,又可以在此基础上进行扩充。
下一段:http://www.csdn.net/develop/read_article.asp?id=27549