天天看點

一個分層架構設計的例子(2)

上篇介紹了實體類(Entity)、資料庫通路類(DAL)、資料通路接口(IDAL)的相關設計,本篇主要讨論下面幾個部分内容:業務邏輯層、緩存機制、界面層等方面。

業務邏輯層,主要是業務邏輯基類的設計,由于資料庫通路類(DAL)的基類封裝了大量的操作實作,是以,業務邏輯層的主要工作是進一步封裝對底層通路接口的實作,如下所示。

一個分層架構設計的例子(2)

    public class BaseBLL<T> where T : BaseEntity, new()

一個分層架構設計的例子(2)

    {

一個分層架構設計的例子(2)

        構造函數

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        對象添加、修改、删除等接口

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        傳回集合的接口

一個分層架構設計的例子(2)

    }

業務層基類封裝了大量的調用,那麼對于業務層的具體操作類,它的工作就很簡單了,基本上隻需要繼承一下基類就可以了,這就是有一個優秀父親的好處,呵呵

一個分層架構設計的例子(2)

    public class Equipment : BaseBLL<EquipmentInfo>

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        public Equipment() : base()

一個分層架構設計的例子(2)

        {

一個分層架構設計的例子(2)

        }

一個分層架構設計的例子(2)

基本上,業務層的設計到此應該收尾了,可是我們注意到,很多開發都使用了緩存的機制來進一步提高程式的性能,下面對這方面進行讨論。緩存的機制,一般是把建立過的對象資源放到一個集合中,需要的時候,調出來,如下業務層的工廠類所示。

一個分層架構設計的例子(2)

    public class BLLFactory<T> where T : class

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        private static Hashtable objCache = new Hashtable();

一個分層架構設計的例子(2)

        public static T Instance

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

            get

一個分層架構設計的例子(2)

            {

一個分層架構設計的例子(2)

                string CacheKey = typeof(T).FullName;

一個分層架構設計的例子(2)

                T bll = (T)objCache[CacheKey];  //從緩存讀取  

一個分層架構設計的例子(2)

                if (bll == null)

一個分層架構設計的例子(2)

                {

一個分層架構設計的例子(2)

                    bll = Reflect<T>.Create(typeof(T).Name, "HuaweiSoftware.IPSPBD.BLL"); //反射建立,并緩存

一個分層架構設計的例子(2)

                }

一個分層架構設計的例子(2)

                return bll;

一個分層架構設計的例子(2)

            }

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

    }  

這是一個業務邏輯類工廠建立類,我們在界面層隻需要如下調用即可構造一個(利用了緩存)具體的業務類出來

一個分層架構設計的例子(2)

CustomerInfo info = BLLFactory<Customer>.Instance.FindByID(ID);

在上面的BaseBLL和BLLFactory類中,有一個Reflect的操作類,這是反射緩存的具體實作所在,我們探讨一下它的實作。

一個分層架構設計的例子(2)

    public class Reflect<T> where T : class 

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        private static Hashtable m_objCache = null;

一個分層架構設計的例子(2)

        public static Hashtable ObjCache

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

                if (m_objCache == null)

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

                    m_objCache = new Hashtable();

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

                return m_objCache;

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        public static T Create(string sName, string sFilePath)

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

            return Create(sName, sFilePath, true);

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        public static T Create(string sName, string sFilePath, bool bCache)

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

            string CacheKey = sFilePath + "." + sName;

一個分層架構設計的例子(2)

            T objType = null;

一個分層架構設計的例子(2)

            if (bCache)

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

                objType = (T)ObjCache[CacheKey];    //從緩存讀取 

一個分層架構設計的例子(2)

                if (!ObjCache.ContainsKey(CacheKey))

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

                    Assembly assObj = CreateAssembly(sFilePath);

一個分層架構設計的例子(2)

                    object obj = assObj.CreateInstance(CacheKey);

一個分層架構設計的例子(2)

                    objType = (T)obj;

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

                    ObjCache.Add(CacheKey, objType);// 寫入緩存 将DAL内某個對象裝入緩存

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

            else

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

                objType = (T)CreateAssembly(sFilePath).CreateInstance(CacheKey); //反射建立 

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

            return objType;

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        public static Assembly CreateAssembly(string sFilePath)

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

            Assembly assObj = (Assembly)ObjCache[sFilePath];

一個分層架構設計的例子(2)

            if (assObj == null)

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

                assObj = Assembly.Load(sFilePath);

一個分層架構設計的例子(2)

                ObjCache.Add(sFilePath, assObj);//将整個DLL裝入緩存

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

            return assObj;

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

另外,如果你在業務層需要實作更加複雜的功能,而資料庫通路基類BaseDAL提供的函數不能滿足你的需要,可以擴充資料通路層的接口和實作,如下所示。

一個分層架構設計的例子(2)

    public interface ICustomer : IBaseDAL<CustomerInfo>

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        List<string> GetAllCustomerNumber();

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        CustomerInfo GetByCustomerNumber(string number);

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

    public class Customer : BaseDAL<CustomerInfo>, ICustomer

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        對象執行個體及構造函數

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        ICustomer 成員

一個分層架構設計的例子(2)

那麼在業務層的類修改如下

一個分層架構設計的例子(2)

    public class Customer : BaseBLL<CustomerInfo>

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        public Customer() : base()

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        public List<string> GetAllCustomerNumber()

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

            ICustomer customerDAL = baseDal as ICustomer;

一個分層架構設計的例子(2)

            return customerDAL.GetAllCustomerNumber();

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

        public CustomerInfo GetByCustomerNumber(string number)

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

            return customerDAL.GetByCustomerNumber(number);

一個分層架構設計的例子(2)
一個分層架構設計的例子(2)

最後,界面方面的設計是見仁見智,但根本一條是利用一些控件,可以統一風格,減少勞動,給出幾個界面的設計截圖供大家參考

WinForm方面的(顔色标明的是使用了特定的界面控件,其中紅色部分為和整個架構整合起來的分頁控件,內建了一些基本的右鍵菜單操作,包括列印功能、資料導出功能等):

Winform分頁控件設計視圖

可以選擇列進行列印

在實際運用過程中的界面效果

WebForm方面的(可以使用之前文章介紹的查詢控件、分頁控件、内容編輯控件):

下圖是查詢控件和分頁控件的一起運用:

修改内容時候的編輯控件

檢視内容時候的編輯控件