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

猜你喜欢

转载自blog.csdn.net/long870294701/article/details/84584678