我正在尝试使用ReportHandler服务来处理报告创建。报告可以设置多个不同数量的参数。在系统中,目前有几种不同的创建报告的方法(MS报告服务,html报告等),并且为每个报告生成数据的方式也不同。我试图将所有内容整合到ActiveReports中。我无法改变系统并更改参数,所以在某些情况下我基本上会得到一个where子句来生成结果,而在另一种情况下,我将获得必须用来生成结果的键/值对。我考虑过使用工厂模式,但由于查询过滤器的数量不同,这将无法工作。
我希望有一个ReportHandler可以接受我的各种输入并吐出报告。此时,我没有看到任何其他方法,而是使用大型switch语句来处理基于reportName的每个报告。有什么建议我可以更好地解决这个问题吗?
答案 0 :(得分:3)
根据您的描述,如果您正在寻找与Factory相匹配的模式,请尝试策略:
希望有所帮助!
答案 1 :(得分:3)
除了策略模式之外,您还可以为每个底层解决方案创建一个适配器。然后使用策略来改变它们。我已经构建了类似的每个报表解决方案,我称之为引擎,除了变量报表解决方案,我们还有变量存储解决方案 - 输出可以存储在SQL服务器或文件系统中。 我建议使用容器然后用正确的引擎初始化它,例如:
public class ReportContainer{
public ReportContainer ( IReportEngine reportEngine, IStorageEngine storage, IDeliveryEngine delivery...)
}
}
/// In your service layer you resolve which engines to use
// Either with a bunch of if statements / Factory / config ...
IReportEngine rptEngine = EngineFactory.GetEngine<IReportEngine>( pass in some values)
IStorageEngine stgEngine = EngineFactory.GetEngine<IStorageEngien>(pass in some values)
IDeliverEngine delEngine = EngineFactory.GetEngine<IDeliverEngine>(pass in some values)
ReportContainer currentContext = new ReportContainer (rptEngine, stgEngine,delEngine);
然后ReportContainer委托工作到依赖引擎...
答案 2 :(得分:0)
我们遇到了类似的问题,并采用了“连接器”的概念,它是主报表生成器应用程序和不同报表引擎之间的接口。通过这样做,我们能够创建一个“通用报表服务器”应用程序。您应该在www.versareports.com上查看。