關於ORM中只有XML沒有映射實體的思考?期待你們的建議

開篇

       好久沒有寫文章了,以前開了太多的系列,一方面是因爲本身對於工做中的思考,另外一方面是本身在業務時間中的對知識的總結,這裏也是比較抱歉,由於以前開的系列,一直都是html

開,完整寫完的很少,這裏實在是對不住你們了,我也是想等過年期間好好的整理下,這些系列和思路,將要寫的內容,都梳理清楚,而後在年後,將一一發布,完善以下的幾個系列:數據庫

       一、Step by Step-構建本身的ORM系列-索引設計模式

       二、設計模式-系列索引session

       三、系統架構師-基礎到企業應用架構-系列索引架構

       四、雲計算-從基礎到應用架構系列索引測試

         固然,我期間可能會還有其餘的相關文章會開啓,可是我不會影響這些文章的進步,否則就太對不起大夥了,也但願你們多多提出本身的想法和意見,有了大家的幫助,我才能寫的this

更完善。謝謝!雲計算

摘要

         最近在項目中也是遇到以下的問題,也是查看了一些相應的資料,可是都沒有很好的解決,問題以下:spa

         一、如何只經過XML文件來完成映射,固然這裏的XML負責ORM中的數據庫表列的相應信息。hibernate

         二、不想爲數據庫中的每一個表都創建實體對象。

         三、可以仍然在界面使用的過程當中方便的操做。

         四、還要考慮一些適應性和低耦合性方面的要求。

         有了上面的幾個要求,通過思考,得出一下的幾個思路,可是都不是理想的解決方案,還請你們看後如下的幾個解決方案,給出意見。

解決思路

                    上面也是給出了幾個問題,我對這幾個問題進行了整理和思考,得出下面的幾個解決方案,可是都不是特別的理想,稍微的深刻提出需求,就沒法知足。

       1、經過NHibernate

            固然,Nhibernate自己已經提供了這方面的操做,我特別的舉例說明以下,若是想詳細的查看,請參考園子裏面的高手博客《李永京》的。

            我這裏將代碼貼出:

            一、咱們先看映射文件

<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>

            二、其餘的配置,我就不詳細說了,關於Nhibernate的配置。下面給出相應的示例代碼:

    using (ISession session = new SessionFactory().OpenSession()) 
    { 
        using (ITransaction trans = session.BeginTransaction()) 
        { 
            IDictionary contract = new Hashtable(); 
            contract["Name"] = "合同名稱"; 
            contract["Pay"] = 0.0M;//合同的金額 
            contract["Description"] = "合同的描述信息";

            //第一個參數爲映射中使用的實體名稱,第二個參數爲實例 
            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(); 
        } 
    }

            經過上面的代碼,通過測試,的確可以將數據,經過Nhibernate提供的相應方法,完成訪問。其餘的相應的操做,我就不給出了,可是經過上面咱們知道,咱們沒有經過建立相應的實體,我

們就能完成映射的操做,的確不錯,不過,這樣的實現,的確有些不便。

 

              2、經過自定義對象

              這個自定義對象應該如何來作呢?自定義對象的思路以下:

              image

             下面來配合這個圖給出示例代碼,不必定能夠運行,具體的公共對象類代碼以下:

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(); 
        } 
    }

           具體的代碼上面已經給出,下面給出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; 
        } 
    }

    固然上面給出的不是完整的,只是爲了演示說明。這樣就能完成與XML之間的映射,具體的訪問的過程當中也能夠相對來講更友好一些。

      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)); 
       }

       3、經過.NET 4.0中的動態類型來完成

                 下面給出實現的思路吧:

                  咱們經過利用.NET4.0中的dynimic來定義一個內存中的實例,該實例是經過XML文件 中的配置的列屬性來動態的建立,具體的代碼以下:

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; 
        }

        經過上面的這個思路,咱們就能夠以下來作:

       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; 
        }

        這樣就完成了,動態建立對象的過程,而且在應用能夠之間使用動態建立的對象,可是有以下問題

        image

        經過上圖中的描述,我想你們都知道,動態類型是動態運行時的編譯,不是靜態編譯,必須在運行時才能解析出動態對象的屬性信息,所以咱們使用起來並不方便,因此我想到以下辦法。

 

        image

        我思考完,發現若是要是能夠實現這樣的插件也就行了,固然目前的思路就到這,查看了相關職能感知的相關文件,可是沒有發現API能夠直接設置或者能夠之間進行控制的方法。


其餘可行思路

          固然我上面只是給了幾種可能可行的方案,可是不必定是合適的方案,還請你們多多指教和拍磚,若是您有好的思路或者實現方案,還請您提出來,多謝您的指

教。

後續

         下篇若是我有好的實現思路,我會給出完整的實現,固然若是沒有思路,那就暫時寫到這裏,多謝你們的集思廣益,可能我鑽牛角尖了,也說不定。

相關文章
相關標籤/搜索