Pages

Two-tier 轉為 three-tier 自動化轉換實例

Mar 15, 2013

2 tier to 3 tier

筆者近期遇到一個案例,原本系統架構是 Windows Form 直接連接資料庫進行存取(如下圖左),
如今要在介面層與資料處理層間加入Web層(如下圖右)。
image_2




筆者實作的想法是:
1. 新增 Web Service 專案,使用原本Data Access Library 存取資料庫
2. 新增 Interface 專案,將原本的資料處理類別逆向產生 Interface
3. 新增一個資料代理類別層,並實作上述所有介面,實作方法就是直接呼叫Web Service
4. 參考MSDN : ConfigurationElement Class 將要實例的類別填在組態設定檔,
     UI 層讀取組態設定檔透過 Activator 產生資料處理物件。
組態設定檔如下
<configSections>
  <section name="DbFactory" type="ProviderFactory.DbFactorySection, ProviderFactory" />
</configSections>
<DbFactory>
  <dbclass>
    <add name="DBClass" type="DBProxyLibrary.DBClass, DBProxyLibrary" />
    <add name="DBClass2" type="DBProxyLibrary.DBClass2, DBProxyLibrary" />
  </dbclass>
</DbFactory>
前後兩版本的程式碼範例:http://files.dotblogs.com.tw/robin/1303/201337173959928.zip

如何自動化?

確定實作方法後,評估實作的工作量可不小,針對一個既有的資料處理類別,得對應寫出:
1. 新增一個 Interface
2. 新增一個 Proxy 類別,實作上面的 Interface
3. 新增一個 Web Service
而這些撰碼的過程,大部份都是 Copy-Paste 動作 或 很機械式的修改
筆者想到透過 Reflection 讀取原本的資料處理類別,就可以分別產生另外三組程式碼。
讀取單一組件取得公開方法,如下:
private static void GenCodeByDllFile(string dllname)
        {
            string dllFileName = string.Format("{0}\\{1}", System.Windows.Forms.Application.StartupPath, dllname);
            System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(dllFileName);

            //讀取所有類別
            foreach (Type t in assembly.GetTypes())
            {
                string tName = t.ToString();
                object obj = assembly.CreateInstance(tName);
                //讀取所有方法
                foreach (MethodInfo m in obj.GetType().GetMethods())
                {
                    //讀取參數
                    ParameterInfo[] ps = m.GetParameters();

                    //TODO 輸出程式

                }
            }
        }
程式碼範例:http://files.dotblogs.com.tw/robin/1303/20133810267568.zip