C#-一種方法工廠的實現
阿新 • • 發佈:2018-12-26
來源
當時在做銷售資料報表功能,需要提供多種報表的資料。每一種報表我都寫了一個方法用於查詢對應的資料。
這些方法有一個共同的特點:出參入參型別一致。方法的名稱我也做了格式化處理。
但是入口只有一個,就是對外提供的呼叫介面只有一個,具體是要獲取那個報表的資料需要根據其中一個數據來做判斷。
我一開始是打算寫個if-else或者switch。旁邊的老前輩看到了後,教了一種實現方式。
他這個方式寫完後,我總是會想到委託,但是又確確實實沒有委託的關鍵字啊之類的。
在此記錄用於後續學習研究,很感謝這位前輩。總是能從前輩身上學到有用的東西。
實現
- 定義倉庫
/// <summary> /// 定義方法倉庫 /// </summary> private Dictionary<string, Func<Dictionary<string, string>, DataTable>> actionStorage;
- 填充倉庫
/// <summary> /// 構造方法,新增委託事件 /// </summary> public ReportFormIBaitsService() { dao = DaoService.GetInstance(DataBaseConst.SqlMap).GetDao<IReportFormIBaitsDao>(); actionStorage = new Dictionary<string, Func<Dictionary<string, string>, DataTable>>(); actionStorage.Add("Mall_GetSCDailyDataDS", (param) => { return GetSCDailyData(param); });//銷售顧問日常資料報表明細 actionStorage.Add("Mall_GetSCDailyDataTotalDS", (param) => { return GetSCDailyDataTotal(param); });//銷售顧問日常資料報表總數 actionStorage.Add("Mall_GetSalesDailyDataDS", (param) => { return GetSalesDailyData(param); });//銷售日報資料報表 actionStorage.Add("Mall_GetSalesDailyDataTotalDS", (param) => { return GetSalesDailyDataTotal(param); });//銷售日報資料報表總數 actionStorage.Add("Mall_GetSalesCountDailyDataDS", (param) => { return GetSalesCountDailyData(param); });//銷售日報資料報表總數 }
- 方法實現
/// <summary>
/// 銷售日報資料報表
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
private DataTable GetSalesDailyData(Dictionary<string, string> param)
{
}
…… ……
- 倉庫使用
/// <summary> /// 繼承自報表服務介面的獲取資料來源的引數的入口 /// </summary> /// <param name="param"></param> /// <param name="datasetName"></param> /// <returns></returns> public DataTable BindReportData(Dictionary<string, string> param, string datasetName = null) { //若入參datasetName在key中且不為null if (!string.IsNullOrWhiteSpace(datasetName) && actionStorage.ContainsKey(datasetName)) { return actionStorage[datasetName](param); } else { return null; } }
createtime:2018-11-28