我有一个要求,用户从下拉列表中选择一个ReportType并点击下载按钮。根据他选择的类型,系统应该生成一个报告。现在我只有QuoteReport的报告类型。将来我会有其他报告类型,如PolicyReport,ClaimReport。现在我也不知道这些报告中的数据字段是什么。
public class QuoteReport
{
public String DeviceType { get; set; }
public String ProductName { get; set; }
public String Description { get; set; }
public String ID { get; set; }
public String Address { get; set; }
}
现在我正在做的是发送报告类型和参数来填充报告,我创建了一个切换案例来捕获被选中的报告类型。
public string PrepareReport(string selectedReport, List<int> Ids)
{
string response = string.Empty;
try
{
ReportTypeEnum reportTypeEnum;
if (Enum.TryParse(selectedReport, out reportTypeEnum))
{
switch (reportTypeEnum)
{
case ReportTypeEnum.QuoteReport:
response = CreateReportData(Ids,response);
break;
default:
break;
}
}
}
catch (Exception exc)
{
handleException(DOWNLOAD_REPORT, exc);
}
return response;
}
我的方法CreateReportData从wcf填充QuoteReport类的字段。
public string CreateReportData(List<int> Ids, string response)
{
List<QuoteReport> quoteReportList = new List<QuoteReport>();
foreach (var Id in Ids)
{
dynamic dynamicEntity;
List<string> devices = proxy.GetData(Id);
for (int i = 0; i < devices.Count; i++)
{
QuoteReport quoteReport = new QuoteReport();
dynamicEntity = JObject.Parse(devices[i]);
quoteReport.Type = dynamicEntity.DeviceTypeString;
quoteReport.ProductName = dynamicEntity.ProductName;
quoteReport.Description = dynamicEntity.Desc;
quoteReport.ID = dynamicEntity.ID;
assetReport.Address = dynamicEntity.Address;
quoteReportList.Add(quoteReport );
}
}
response = JsonConvert.SerializeObject(quoteReportList );
return response;
}
现在我很困惑如何让我的代码更通用。或者我应该使用像Factory这样的设计模式来使代码适应未来的需求。如何使CreateReportData方法通用,以便它接受任何类类型并从服务中填充其属性。
答案 0 :(得分:2)
我不会重写所有内容(你有som命名问题和conserns问题的分离),但总的来说,你可以拥有一个签名为IReport
的接口Generate(List<int> Ids)
,然后是每种类型的report实现了这个(并且类/报告本身决定如何处理数据)
public class QuoteReport: IReport
{
public String DeviceType { get; set; }
public String ProductName { get; set; }
public String Description { get; set; }
public String ID { get; set; }
public String Address { get; set; }
public void Generate(List<int> ids)
{
// create "itself"
}
}
根据您的一般情况,您可以决定在哪里绘制分色,然后将哪些内容传递给Generate()。它可以是设备列表,也可以是您的代理+ ID