Two-tier 轉為 three-tier 自動化轉換實例
2 tier to 3 tier
筆者近期遇到一個案例,原本系統架構是 Windows Form 直接連接資料庫進行存取(如下圖左),如今要在介面層與資料處理層間加入Web層(如下圖右)。
筆者實作的想法是:
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<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>
如何自動化?
確定實作方法後,評估實作的工作量可不小,針對一個既有的資料處理類別,得對應寫出: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
{
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 輸出程式
}
}
}