关于ORM中只有XML没有映射实体的思考?期待大家的建议
開篇
?????? 很久沒(méi)有寫文章了,之前開了太多的系列,一方面是由于自己對(duì)于工作中的思考,另一方面是自己在業(yè)務(wù)時(shí)間中的對(duì)知識(shí)的總結(jié),這里也是比較抱歉,因?yàn)橹伴_的系列,一直都是
開,完整寫完的不多,這里實(shí)在是對(duì)不住大家了,我也是想等過(guò)年期間好好的整理下,這些系列和思路,將要寫的內(nèi)容,都梳理清楚,然后在年后,將一一發(fā)布,完善如下的幾個(gè)系列:
?????? 1、Step by Step-構(gòu)建自己的ORM系列-索引
?????? 2、設(shè)計(jì)模式-系列索引
?????? 3、系統(tǒng)架構(gòu)師-基礎(chǔ)到企業(yè)應(yīng)用架構(gòu)-系列索引
?????? 4、云計(jì)算-從基礎(chǔ)到應(yīng)用架構(gòu)系列索引
???????? 當(dāng)然,我期間可能會(huì)還有其他的相關(guān)文章會(huì)開啟,但是我不會(huì)影響這些文章的進(jìn)步,不然就太對(duì)不起大伙了,也希望大家多多提出自己的想法和意見,有了你們的幫助,我才能寫的
更完善。謝謝!
摘要
???????? 最近在項(xiàng)目中也是遇到如下的問(wèn)題,也是查看了一些相應(yīng)的資料,但是都沒(méi)有很好的解決,問(wèn)題如下:
???????? 1、如何只通過(guò)XML文件來(lái)完成映射,當(dāng)然這里的XML負(fù)責(zé)ORM中的數(shù)據(jù)庫(kù)表列的相應(yīng)信息。
???????? 2、不想為數(shù)據(jù)庫(kù)中的每個(gè)表都建立實(shí)體對(duì)象。
???????? 3、能夠仍然在界面使用的過(guò)程中方便的操作。
???????? 4、還要考慮一些適應(yīng)性和低耦合性方面的要求。
???????? 有了上面的幾個(gè)要求,經(jīng)過(guò)思考,得出一下的幾個(gè)思路,但是都不是理想的解決方案,還請(qǐng)大家看后以下的幾個(gè)解決方案,給出意見。
解決思路
??????????????????? 上面也是給出了幾個(gè)問(wèn)題,我對(duì)這幾個(gè)問(wèn)題進(jìn)行了整理和思考,得出下面的幾個(gè)解決方案,但是都不是特別的理想,稍微的深入提出需求,就無(wú)法滿足。
?????? 一、通過(guò)NHibernate
??????????? 當(dāng)然,Nhibernate本身已經(jīng)提供了這方面的操作,我特別的舉例說(shuō)明如下,如果想詳細(xì)的查看,請(qǐng)參考園子里面的高手博客《李永京》的。
??????????? 我這里將代碼貼出:
??????????? 1、我們先看映射文件
<class entity-name="Contract"><id name="Id" type="int"><generator class="Test"/></id><property name="Name" not-null="true" length="25" type="string"/><property name="Pay" not-null="true" type="decimal"/> <property name="CreateTime" not-null="true" type="datetime"/> <property name="Description" not-null="true" length="200" type="string"/></class>??????????? 2、其他的配置,我就不詳細(xì)說(shuō)了,關(guān)于Nhibernate的配置。下面給出相應(yīng)的示例代碼:
??? using (ISession session = new SessionFactory().OpenSession())
??? {
??????? using (ITransaction trans = session.BeginTransaction())
??????? {
??????????? IDictionary contract = new Hashtable();
??????????? contract["Name"] = "合同名稱";
??????????? contract["Pay"] = 0.0M;//合同的金額
??????????? contract["Description"] = "合同的描述信息";
??????????? //第一個(gè)參數(shù)為映射中使用的實(shí)體名稱,第二個(gè)參數(shù)為實(shí)例
??????????? session.Save("Contract", contract);
??????????? trans.Commit();
??????? }
??? }
??????????? 上面給出的保存的代碼,更新的代碼雷同。給出查詢代碼:
??? using (ISession session = new SessionFactory().OpenSession())
??? {
??????? using (ITransaction trans = session.BeginTransaction())
??????? {
??????????? IDictionary contract =(IDictionary) session.CreateQuery(“ from Contract where ContractID=:id”)
?????????????????????????????????????????????????? .Add(“id”,1);
?????????????????????????????????????????????????? .UniqueResult();
??????????? session.Clear();
??????????? trans.Commit();
??????? }
??? }
??????????? 通過(guò)上面的代碼,經(jīng)過(guò)測(cè)試,的確能夠?qū)?shù)據(jù),通過(guò)Nhibernate提供的相應(yīng)方法,完成訪問(wèn)。其他的相應(yīng)的操作,我就不給出了,但是通過(guò)上面我們知道,我們沒(méi)有通過(guò)創(chuàng)建相應(yīng)的實(shí)體,我
們就能完成映射的操作,的確不錯(cuò),不過(guò),這樣的實(shí)現(xiàn),的確有些不便。
?
????????????? 二、通過(guò)自定義對(duì)象
????????????? 這個(gè)自定義對(duì)象應(yīng)該如何來(lái)做呢?自定義對(duì)象的思路如下:
?????????????
???????????? 下面來(lái)配合這個(gè)圖給出示例代碼,不一定可以運(yùn)行,具體的公共對(duì)象類代碼如下:
public class CommonObject : IList
??? {
??????? private IDictionary<string, Column> columns = null;
??????? public CommonObject()
??????? {
??????????? columns = new Dictionary<string, Column>();
??????? }
??????? public CommonObject(int capacity)
??????? {
??????????? columns = new Dictionary<string, Column>(capacity);
??????? }
??????? public Column Add(Column col)
??????? {
??????????? this.columns.Add(col.Name,col);
??????????? return col;
??????? }
??????? public bool Remove(Column col)
??????? {
??????????? return this.columns.Remove(col.Name);
??????? }
??????? public Column this[string key]
??????? {
??????????? get
??????????? {
??????????????? return this.columns[key];
??????????? }
??????????? set
??????????? {
??????????????? this.columns[key] = value;
??????????? }
??????? }
??????? public int Add(object value)
??????? {
??????????? throw new NotImplementedException();
??????? }
??????? public void Clear()
??????? {
??????????? throw new NotImplementedException();
??????? }
??????? public bool Contains(object value)
??????? {
??????????? throw new NotImplementedException();
??????? }
??????? public int IndexOf(object value)
??????? {
??????????? throw new NotImplementedException();
??????? }
??????? public void Insert(int index, object value)
??????? {
??????????? throw new NotImplementedException();
??????? }
??????? public bool IsFixedSize
??????? {
??????????? get
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????? }
??????? public bool IsReadOnly
??????? {
??????????? get
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????? }
??????? public void Remove(object value)
??????? {
??????????? throw new NotImplementedException();
??????? }
??????? public void RemoveAt(int index)
??????? {
??????????? throw new NotImplementedException();
??????? }
??????? public object this[int index]
??????? {
??????????? get
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????????? set
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????? }
??????? public void CopyTo(Array array, int index)
??????? {
??????????? throw new NotImplementedException();
??????? }
??????? public int Count
??????? {
??????????? get
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????? }
??????? public bool IsSynchronized
??????? {
??????????? get
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????? }
??????? public object SyncRoot
??????? {
??????????? get
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????? }
??????? public IEnumerator GetEnumerator()
??????? {
??????????? throw new NotImplementedException();
??????? }
??? }
?????????? 具體的代碼上面已經(jīng)給出,下面給出Column的示例代碼:
class Column
??? {
??????? public string Name
??????? {
??????????? get;
??????????? set;
??????? }
??????? public object Value
??????? {
??????????? get;
??????????? set;
??????? }
??????? public System.Data.DbType DataType
??????? {
??????????? get;
??????????? set;
??????? }
??????? public string? DbColumnName
??????? {
??????????? get;
??????????? set;
??????? }
??????? public int Length
??????? {
??????????? get;
??????????? set;
??????? }
??????? public bool IsNull
??????? {
??????????? get;
??????????? set;
??????? }
??? }
??? 當(dāng)然上面給出的不是完整的,只是為了演示說(shuō)明。這樣就能完成與XML之間的映射,具體的訪問(wèn)的過(guò)程中也可以相對(duì)來(lái)說(shuō)更友好一些。
????? public void Test()
?????? {
?????????? CommonObject comObj = CommonFactory<CommonObject>();
?????????? comObj.Add(new Column());
?????????? comObj["test"] = new Column();
?????? }
?????? private T CommonFactory<T>()
?????? {
?????????? return (T)Activator.CreateInstance(typeof(T));
?????? }
?????? 三、通過(guò).NET 4.0中的動(dòng)態(tài)類型來(lái)完成
???????????????? 下面給出實(shí)現(xiàn)的思路吧:
????????????????? 我們通過(guò)利用.NET4.0中的dynimic來(lái)定義一個(gè)內(nèi)存中的實(shí)例,該實(shí)例是通過(guò)XML文件 中的配置的列屬性來(lái)動(dòng)態(tài)的創(chuàng)建,具體的代碼如下:
static void Main(string[] args)
??????? {
??????????? dynamic obj=? GetTest();
??????????? Console.WriteLine(obj.name);
??????????? Console.WriteLine(obj.tt);
??????????? System.Threading.Thread.Sleep(10000);
??????? }
??????? private static dynamic GetTest()
??????? {
??????????? dynamic obj = new ExpandoObject();
??????????? var person = obj as IDictionary<string, object>;
??????????? person["name"] = "test";
??????????? person["tt"] = "aaa";
??????????? return obj;
??????? }
??????? 通過(guò)上面的這個(gè)思路,我們就可以如下來(lái)做:
?????? private static dynamic GetTest1(string xmlFile)
??????? {
??????????? dynamic obj = new ExpandoObject();
??????????? var person = obj as IDictionary<string, object>;
??????????? XmlDocument doc = new XmlDocument();
??????????? doc.LoadXml(xmlFile);
??????????? Property [] list = XMLHelper.GetPropertys(doc);
??????????? foreach (Property property in list)
??????????? {
??????????????? person[property.Name] = property.Value;
??????????? }
??????????? person["name"] = "test";
??????????? person["tt"] = "aaa";
??????????? return obj;
??????? }
??????? 這樣就完成了,動(dòng)態(tài)創(chuàng)建對(duì)象的過(guò)程,并且在應(yīng)用可以之間使用動(dòng)態(tài)創(chuàng)建的對(duì)象,但是有如下問(wèn)題
???????
??????? 通過(guò)上圖中的描述,我想大家都知道,動(dòng)態(tài)類型是動(dòng)態(tài)運(yùn)行時(shí)的編譯,不是靜態(tài)編譯,必須在運(yùn)行時(shí)才能解析出動(dòng)態(tài)對(duì)象的屬性信息,因此我們使用起來(lái)并不方便,所以我想到如下辦法。
?
???????
??????? 我思考完,發(fā)現(xiàn)如果要是可以實(shí)現(xiàn)這樣的插件也就好了,當(dāng)然目前的思路就到這,查看了相關(guān)職能感知的相關(guān)文件,但是沒(méi)有發(fā)現(xiàn)API可以直接設(shè)置或者可以之間進(jìn)行控制的方法。
其他可行思路
????????? 當(dāng)然我上面只是給了幾種可能可行的方案,但是不一定是合適的方案,還請(qǐng)大家多多指教和拍磚,如果您有好的思路或者實(shí)現(xiàn)方案,還請(qǐng)您提出來(lái),多謝您的指
教。
后續(xù)
???????? 下篇如果我有好的實(shí)現(xiàn)思路,我會(huì)給出完整的實(shí)現(xiàn),當(dāng)然如果沒(méi)有思路,那就暫時(shí)寫到這里,多謝大家的集思廣益,可能我鉆牛角尖了,也說(shuō)不定。
轉(zhuǎn)載于:https://www.cnblogs.com/hegezhou_hot/archive/2011/01/21/1941450.html
總結(jié)
以上是生活随笔為你收集整理的关于ORM中只有XML没有映射实体的思考?期待大家的建议的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle修改表字段
- 下一篇: asp.net ajax控件工具集 Au