1. 程式人生 > >C#-一種方法工廠的實現

C#-一種方法工廠的實現

來源

當時在做銷售資料報表功能,需要提供多種報表的資料。每一種報表我都寫了一個方法用於查詢對應的資料。
這些方法有一個共同的特點:出參入參型別一致。方法的名稱我也做了格式化處理。
但是入口只有一個,就是對外提供的呼叫介面只有一個,具體是要獲取那個報表的資料需要根據其中一個數據來做判斷。
我一開始是打算寫個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