之前的那個開發框架好幾個朋友都用在了項目裡面,也給我提出了很寶貴的意見,雖然最近一直沒有什麼更新,但是針對朋友們提出的建議,我都仔細考慮了一翻,很多的意見
我都融入了系統裡面,將不足之處修改過來,本來想把報表的事兒給搞定,但是想了幾種方案結果都不了了之。曾經有一個朋友說很欣賞我那個讀取DLL文件的框架,以前我覺得寫得挺亂的,代碼也是比較混亂,有時候我自己翻出來居然要想很久才知道那些代碼是什麼意思,當時之所以捨棄了這套框架,是因為覺得整個項目的Size會越來越大,因為每一個窗體都是一個類庫,然後編譯為DLL文件,程序去讀取並加載這些DLL文件,所以采取了直接寫在竹程序裡面的方式,詳細介紹在這裡:
這樣一來也有一個問題,主程序的EXE越來越大,我覺得理論上是這樣,所以最近忙裡偷閒,將原來的那套框架重新整理了一下,主要有以下幾個變化:
1.每一個窗體皆為一個類庫,實現相應的接口。
2.用戶打開窗體的時候不是直接Open窗體,而是加載DLL文件,讀取DLL文件裡面的信息。
3.每一個窗體所實現的業務仍然在自己的類文件中完成。
在新建的項目裡面實現如下業務:
[csharp] using System;
using System.Collections.Generic;
using System.Text;
using CP.Kernel.Base;
namespace sysUserGroup
{
[Serializable]
public class Plugins : IPugins
{
private FrmUserGroup f;
public void Activate()
{
f.Activate();
}
public void Dispose()
{
f.Close();
GC.Collect();
GC.SuppressFinalize(this);
}
public void Hide()
{
f.Close();
}
public string Name
{
get { return "角色資料設定"; }
}
public string GUID
{
get { return "F2080504B6DC4963BC0963FEFA0E1AAD"; }
}
public string Version
{
get { return "1.0.0.0"; }
}
public string Manufacturer
{
get { return "制造商"; }
}
public string Description
{
get { return "用於設定角色資料"; }
}
public string TCode
{
get { return "JSZL"; }
}
public string FrmUrl
{
get { return "sysUserGroup.dll"; }
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using CP.Kernel.Base;
namespace sysUserGroup
{
[Serializable]
public class Plugins : IPugins
{
private FrmUserGroup f;
public void Activate()
{
f.Activate();
}
public void Dispose()
{
f.Close();
GC.Collect();
GC.SuppressFinalize(this);
}
public void Hide()
{
f.Close();
}
public string Name
{
get { return "角色資料設定"; }
}
public string GUID
{
get { return "F2080504B6DC4963BC0963FEFA0E1AAD"; }
}
public string Version
{
get { return "1.0.0.0"; }
}
public string Manufacturer
{
get { return "制造商"; }
}
public string Description
{
get { return "用於設定角色資料"; }
}
public string TCode
{
get { return "JSZL"; }
}
public string FrmUrl
{
get { return "sysUserGroup.dll"; }
}
}
}
這裡入去傳入進來的DLL文件:
[csharp] public void LoadDLL(string DllName)
{
try
{
if (DllName.Substring(DllName.Length - 4).ToUpper() == ".DLL")
{
DllName = DllName.Replace(".dll", "");
}
if (string.IsNullOrEmpty(DllName))
return;
if (!allenSingleton.DicLoadDll.ContainsKey(DllName))
{
IPugins objLoadDll;
if (allenSingleton.DicPugins.ContainsKey(DllName))
{
objLoadDll = allenSingleton.DicPugins[DllName];
}
else
{
objLoadDll = CPUtility.LoadDll(DllName);
}
if (objLoadDll != null)
objLoadDll.Show(dockPanel, DockState.Document);
allenSingleton.DicLoadDll.Add(DllName, objLoadDll);
}
else
{
allenSingleton.DicLoadDll[DllName].Activate();
}
}
catch (Exception ex)
{
ShowMsg(ex.Message);
}
}
public void LoadDLL(string DllName)
{
try
{
if (DllName.Substring(DllName.Length - 4).ToUpper() == ".DLL")
{
DllName = DllName.Replace(".dll", "");
}
if (string.IsNullOrEmpty(DllName))
return;
if (!allenSingleton.DicLoadDll.ContainsKey(DllName))
{
IPugins objLoadDll;
if (allenSingleton.DicPugins.ContainsKey(DllName))
{
objLoadDll = allenSingleton.DicPugins[DllName];
}
else
{
objLoadDll = CPUtility.LoadDll(DllName);
}
if (objLoadDll != null)
objLoadDll.Show(dockPanel, DockState.Document);
allenSingleton.DicLoadDll.Add(DllName, objLoadDll);
}
else
{
allenSingleton.DicLoadDll[DllName].Activate();
}
}
catch (Exception ex)
{
ShowMsg(ex.Message);
}
}
這個框架比起之前的那一套,數據處理方面沒有什麼變化,仍然采取存儲過程實現業務邏輯,程序裡面基本上面看不到SQL語句;布局和風格也是沿用以前的做法,仍然是多文檔的布局模式,整體效果還是比較大方的,主要的變化就是核心部分,可以說現在的這套程序跟之前的那一套核心內容完全不一樣了,在耦合性方面也有一些改善。加載的窗體如下圖,都是DLL:
大致效果圖: