题
我正在尝试使用ReportHandler服务来处理报告创建。报告可以设置多个不同数量的参数。在系统中,目前有几种不同的创建报告的方法(MS报告服务,html报告等),并且为每个报告生成数据的方式也不同。我试图将所有内容整合到ActiveReports中。我无法改变系统并更改参数,所以在某些情况下我基本上会得到一个where子句来生成结果,而在另一种情况下,我将获得必须用来生成结果的键/值对。我考虑过使用工厂模式,但由于查询过滤器的数量不同,这将无法工作。
我希望有一个ReportHandler可以接受我的各种输入并吐出报告。此时,我没有看到任何其他方法,而是使用大型switch语句来处理基于reportName的每个报告。有什么建议我可以更好地解决这个问题吗?
解决方案
根据您的描述,如果您正在寻找与Factory相匹配的模式,请尝试策略:
- 您的上下文可以是一个自定义类,它封装和抽象不同的报表输入(您可以使用此部分的AbstractFactory模式)
- 您的策略可以实现任意数量的不同查询过滤器或所需的其他逻辑。如果您将来需要更改系统,只需创建新策略即可在报告工具之间切换。 醇>
希望有所帮助!
其他提示
除了策略模式之外,您还可以为每个底层解决方案创建一个适配器。然后使用策略来改变它们。我已经构建了类似的每个报表解决方案,我称之为引擎,除了变量报表解决方案,我们还有变量存储解决方案 - 输出可以存储在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委托工作到依赖引擎...
我们遇到了类似的问题,并采用了“连接器”的概念。这是主报表生成器应用程序和不同报表引擎之间的接口。通过这样做,我们能够创建“通用报告服务器”。应用。您应该在www.versareports.com上查看。
不隶属于 StackOverflow