推薦:基于.NET平臺的分層架構(gòu)實戰(zhàn)(五)接口的設(shè)計與實現(xiàn)接下來,將進(jìn)行接口的設(shè)計。這里包括數(shù)據(jù)訪問層接口和業(yè)務(wù)邏輯層接口。在分層架構(gòu)中,接口扮演著非常重要的角色,它不但直接決定了各層中的各個操作類需要實現(xiàn)何種操作,而且它明確了各個層次的
封裝依賴注入代碼
因為很多依賴注入代碼非常相似,為了減少重復(fù)性代碼,我們將可復(fù)用的代碼先封裝在一個類中。具體代碼如下(這個類放在Factory工程下):
|
using System; using System.Configuration; using System.Reflection; using System.Web; using System.Web.Caching; using NGuestBook.Utility;
namespace NGuestBook.Factory { /**//// <summary> /// 依賴注入提供者 /// 使用反射機(jī)制實現(xiàn) /// </summary> public sealed class DependencyInjector { /**//// <summary> /// 取得數(shù)據(jù)訪問層對象 /// 首先檢查緩存中是否存在,如果不存在,則利用反射機(jī)制返回對象 /// </summary> /// <param name="className">數(shù)據(jù)訪問類名稱</param> /// <returns>數(shù)據(jù)訪問層對象</returns> public static object GetDALObject(string className) { /**//// <summary> /// 取得數(shù)據(jù)訪問層名稱,首先檢查緩存,不存在則到配置文件中讀取 /// 緩存依賴項為Web.Config文件 /// </summary> object dal = CacheAccess.GetFromCache("DAL"); if (dal == null) { CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config")); dal = ConfigurationManager.AppSettings["DAL"]; CacheAccess.SaveToCache("DAL", dal, fileDependency); }
/**//// <summary> /// 取得數(shù)據(jù)訪問層對象 /// </summary> string dalName = (string)dal; string fullClassName = dalName "." className; object dalObject = CacheAccess.GetFromCache(className); if (dalObject == null) { CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config")); dalObject = Assembly.Load(dalName).CreateInstance(fullClassName); CacheAccess.SaveToCache(className, dalObject, fileDependency); }
return dalObject; }
/**//// <summary> /// 取得業(yè)務(wù)邏輯層對象 /// 首先檢查緩存中是否存在,如果不存在,則利用反射機(jī)制返回對象 /// </summary> /// <param name="className">業(yè)務(wù)邏輯類名稱</param> /// <returns>業(yè)務(wù)邏輯層對象</returns> public static object GetBLLObject(string className) { /**//// <summary> /// 取得業(yè)務(wù)邏輯層名稱,首先檢查緩存,不存在則到配置文件中讀取 /// 緩存依賴項為Web.Config文件 /// </summary> object bll = CacheAccess.GetFromCache("BLL"); if (bll == null) { CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config")); bll = ConfigurationManager.AppSettings["BLL"]; CacheAccess.SaveToCache("BLL", bll, fileDependency); }
/**//// <summary> /// 取得業(yè)務(wù)邏輯層對象 /// </summary> string bllName = (string)bll; string fullClassName = bllName "." className; object bllObject = CacheAccess.GetFromCache(className); if (bllObject == null) { CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config")); bllObject = Assembly.Load(bllName).CreateInstance(fullClassName); CacheAccess.SaveToCache(className, bllObject, fileDependency); }
return bllObject; } } }
|
實現(xiàn)工廠
下面使用兩個輔助類,實現(xiàn)數(shù)據(jù)訪問層工廠和業(yè)務(wù)邏輯層工廠。
|
using System; using NGuestBook.IDAL;
namespace NGuestBook.Factory { /**//// <summary> /// 數(shù)據(jù)訪問層工廠,用于獲取相應(yīng)的數(shù)據(jù)訪問層對象 /// 使用Abstract Factory設(shè)計模式 Facace設(shè)計模式 反射機(jī)制 緩存機(jī)制設(shè)計 /// </summary> public sealed class DALFactory { /**//// <summary> /// 獲取管理員數(shù)據(jù)訪問層對象 /// </summary> /// <returns>管理員數(shù)據(jù)訪問層對象</returns> public static IAdminDAL CreateAdminDAL() { return (IAdminDAL)DependencyInjector.GetDALObject("AdminDAL"); } /**//// <summary> /// 獲取留言數(shù)據(jù)訪問層對象 /// </summary> /// <returns>留言數(shù)據(jù)訪問層對象</returns> public static IMessageDAL CreateMessageDAL() { return (IMessageDAL)DependencyInjector.GetDALObject("MessageDAL"); }
/**//// <summary> /// 獲取評論數(shù)據(jù)訪問層對象 /// </summary> /// <returns>評論數(shù)據(jù)訪問層對象</returns> public static ICommentDAL CreateCommentDAL() { return (ICommentDAL)DependencyInjector.GetDALObject("CommentDAL"); } } }
|
|
using System; using NGuestBook.IBLL;
namespace NGuestBook.Factory { /**//// <summary> /// 業(yè)務(wù)邏輯層工廠,用于獲取相應(yīng)的業(yè)務(wù)邏輯層對象 /// 使用Abstract Factory設(shè)計模式 Facace設(shè)計模式 反射機(jī)制 緩存機(jī)制設(shè)計 /// </summary> public sealed class BLLFactory { /**//// <summary> /// 獲取管理員業(yè)務(wù)邏輯層對象 /// </summary> /// <returns>管理員業(yè)務(wù)邏輯層對象</returns> public static IAdminBLL CreateAdminBLL() { return (IAdminBLL)DependencyInjector.GetBLLObject("AdminBLL"); }
/**//// <summary> /// 獲取留言業(yè)務(wù)邏輯層對象 /// </summary> /// <returns>留言業(yè)務(wù)邏輯層對象</returns> public static IMessageBLL CreateMessageBLL() { return (IMessageBLL)DependencyInjector.GetBLLObject("MessageBLL"); }
/**//// <summary> /// 獲取評論業(yè)務(wù)邏輯層對象 /// </summary> /// <returns>評論業(yè)務(wù)邏輯層對象</returns> public static ICommentBLL CreateCommentBLL() { return (ICommentBLL)DependencyInjector.GetBLLObject("CommentBLL"); } } }
|
分享:基于.NET平臺的分層架構(gòu)實戰(zhàn)(四)實體類的設(shè)計與實現(xiàn)實體類是現(xiàn)實實體在計算機(jī)中的表示。它貫穿于整個架構(gòu),負(fù)擔(dān)著在各層次及模塊間傳遞數(shù)據(jù)的職責(zé)。一般來說,實體類可以分為“貧血實體類”和“充血實體類”,前者僅僅保存實