大庆油田 张敬新
引子
在Silverlight企业级项目开发中,访问数据库通常需要用到WCF作为数据支撑来提供数据服务,而数据基本上是以文本方式组织的。所以,在Silverlight端和WCF端就要订立紧耦合的契约机制。
一般而言,WCF端只提供符合双方约定格式定义的数据体,而Silverlight开发端在使用数据的时候,再根据双方的契约关系,将数据体转化成为相应关系型的数据,Silverlight端和WCF端在数据使用上基本上是一一对应的关系。
实现方式1 ———— 数据体为中心
为便于问题的阐述,下面以一个非常简单的实例为例。
假设源数据有一个通讯录表,其表名为AddressBook,表结构为
字段名 | 类型 |
Name | String |
String |
数据只有2行,
Name | |
张艳国 | 183585478 |
张敬新 | 267282830 |
首先,先组织成为源数据,代码如下:
#region 源数据 //数据结构 DataTable dtAddressBook = new DataTable(“AddressBook”); dtAddressBook.Columns.Add(new DataColumn(“Name”,Type.GetType(“System.String”))); dtAddressBook.Columns.Add(new DataColumn(“QQ”, Type.GetType(“System.String”))); //数据体 dtAddressBook.Rows.Add(“张艳国”, “183585478”); dtAddressBook.Rows.Add(“张敬新”, “267282830”); #endregion 源数据 |
这样,数据就成为了DataTable表类型的数据了,一般在oracle等数据库中使用的数据,都可以以这种方式转化为.NET下的DataTable表类型数据,但有些系统不能够使用DataTable表类型数据,例如Silverlight端开发过程,这就需要将其生成中间数据体,例如XML格式体数据。
下面的代码就是将其加工成为XML格式体数据:
#region 数据体组织成为Xml格式数据 //表数据 string strXmlData = “”; using (MemoryStream ms = new MemoryStream()) { dtAddressBook.WriteXml(ms); ms.Seek(0, SeekOrigin.Begin); using (StreamReader sr = new StreamReader(ms)) { string dtXml = sr.ReadToEnd(); strXmlData = dtXml; } } #endregion 数据体组织成为Xml格式数据 |
这样组织加工成的数据如下:
企业应用系统在使用数据提供方提供的数据时,需要再次将其转化为.NET下的DataTable表类型数据,先要依据双方的数据结构协定建立表结构,然后再将XML格式体数据追加到DataTable表中,进而再将该表交给应用系统使用。
下面的代码就是将XML格式体数据追加到DataTable表:
#region 应用端将组织成为Xml格式的数据转化为应用数据 DataTable dtAddressBook2 = new DataTable(“AddressBook”); dtAddressBook2.Columns.Add(new DataColumn(“Name”, Type.GetType(“System.String”))); dtAddressBook2.Columns.Add(new DataColumn(“QQ”, Type.GetType(“System.String”))); string strXmlData2 = strXmlData; MemoryStream msXmlData2=new MemoryStream(System.Text.Encoding.UTF8.GetBytes(strXmlData2)); dtAddressBook2.ReadXml(msXmlData2); #endregion 应用端将组织成为Xml格式的数据转化为应用数据 |
实现方式2 ———— 自标准数据体为中心
在实现方式1,我们会发现,数据提供者和数据消费者的耦合度非常高,一旦数据结构发生了变化,数据提供者和数据消费者就要及时进行沟通协商,重新订立契约关系,那么,不仅数据提供者需要修改系统,而且数据消费者一方也必须修改其系统,系统非常脆弱不够灵活。
为了改进实现方式1存在的这种问题,数据提供者可以在供应XML格式体数据的同时,提供数据格式信息,将数据格式信息与XML格式体数据打包成为一个整体,提供给数据消费者。而数据消费者一方,只需依据提供的数据格式信息创建企业应用系统使用的格式数据结构,再将XML格式数据体追加到企业应用系统使用的格式数据中。
这样,数据提供者和数据消费者就大大降低了二者之间的耦合度,从紧耦合变为了松耦合,数据提供者和数据消费者可以相互独立地开展工作,而不必经常沟通协调契约关系,大大地提高了系统的健壮性和灵活性。
为便于问题的阐述,仍然以实现方式1中的实例为例。
假设源数据有一个通讯录表,其表名为AddressBook,表结构为
字段名 | 类型 |
Name | String |
String |
数据只有2行,
Name | |
张艳国 | 183585478 |
张敬新 | 267282830 |
首先,先组织成为源数据,代码如下:
#region 源数据 //数据结构 DataTable dtAddressBook = new DataTable(“AddressBook”); dtAddressBook.Columns.Add(new DataColumn(“Name”,Type.GetType(“System.String”))); dtAddressBook.Columns.Add(new DataColumn(“QQ”, Type.GetType(“System.String”))); //数据体 dtAddressBook.Rows.Add(“张艳国”, “183585478”); dtAddressBook.Rows.Add(“张敬新”, “267282830”); #endregion 源数据 |
这样,数据就成为了DataTable表类型的数据了,一般在oracle等数据库中使用的数据,都可以以这种方式转化为.NET下的DataTable表类型数据,但有些系统不能够使用DataTable表类型数据,例如Silverlight端开发过程,这就需要将其生成中间数据体,例如XML格式体数据。
下面的代码生成源数据结构信息数据及XML格式体数据:
#region 数据体组织成为带有结构信息的Xml格式数据 //表结构 string strXmlStructure = “”; using (MemoryStream ms = new MemoryStream()) { dtAddressBook.WriteXmlSchema(ms); ms.Seek(0, SeekOrigin.Begin); using (StreamReader sr = new StreamReader(ms)) { string dtXml = sr.ReadToEnd(); strXmlStructure = dtXml; } } //表数据 string strXmlData = “”; using (MemoryStream ms = new MemoryStream()) { dtAddressBook.WriteXml(ms); ms.Seek(0, SeekOrigin.Begin); using (StreamReader sr = new StreamReader(ms)) { string dtXml = sr.ReadToEnd(); strXmlData = dtXml; } } //带有表结构及数据的XML数据 XmlDocument d1 = new XmlDocument(); d1.LoadXml(strXmlStructure); //表数据 XmlDocument d2 = new XmlDocument(); d2.LoadXml(strXmlData); XmlDocument doc = new XmlDocument(); doc.LoadXml(@”<OracleTable/>”); XmlNode root = doc.DocumentElement; XmlNode root1 = doc.ImportNode(d1.DocumentElement, true); XmlNode root2 = doc.ImportNode(d2.DocumentElement, true); root.AppendChild(root1); root.AppendChild(root2); string xml = root.OuterXml; #endregion 数据体组织成为带有结构信息的Xml格式数据 |
这样组织加工成的源数据结构数据如下:
从成带有源数据结构信息及数据的XML数据中,抽取出结构信息,构建企业应用系统数据的结构表,再从XML数据中抽取出数据添加到应用系统数据表中。
下面的代码是具体的实现:
#region 应用端将组织成为Xml格式的数据转化为应用数据 string xml2 = xml; string head = “<xs:schema”; string end = “</xs:schema>”; int ih = xml2.IndexOf(head); int ie = xml2.IndexOf(end); string strXmlStructure2 = xml2.Substring(ih, ie – ih + end.Length); DataTable dtAddressBook2 = new DataTable(); MemoryStream msXmlStructure2 = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(strXmlStructure2)); dtAddressBook2.ReadXmlSchema(msXmlStructure2); head = “<DocumentElement>”; end = “</DocumentElement>”; ih = xml2.IndexOf(head); ie = xml2.IndexOf(end); string strXmlData2 = xml2.Substring(ih, ie – ih + end.Length); MemoryStream msXmlData2 = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(strXmlData2)); dtAddressBook2.ReadXml(msXmlData2); #endregion 应用端将组织成为Xml格式的数据转化为应用数据 |
结语
上述论述,只是我在进行项目开发过程中的一些模型化的提炼和抽象,旨在便于说明问题和思想,其中还有很多细节性的问题需要进一步优化,敬请指教。
原创文章,作者:智慧城市网,如若转载,请注明出处:https://www.zhihuichengshi.cn/xinwenzixun/13433.html