报表处理程序体系结构问题

本文关键字:问题 程序体系结构 表处理 报表 | 更新日期: 2023-09-27 17:48:53

我正在尝试使用ReportHandler服务来处理报告创建。报告可以具有多个不同数量的参数,这些参数可以进行设置。在目前的系统中,有几种不同的创建报告的方法(MS报告服务、html报告等),每个报告的数据生成方式也不同。我正在尝试将所有内容整合到ActiveReports中。我不能更改系统和参数,所以在某些情况下,我基本上会得到一个where子句来生成结果,在另一种情况下,我们会得到必须用于生成结果的键/值对。我曾考虑过使用工厂模式,但由于查询过滤器的数量不同,这是行不通的。

我希望有一个单一的ReportHandler,它可以接受我的各种输入并吐出报告。在这一点上,除了使用一个大的switch语句来处理基于reportName的每个报告之外,我看不到任何其他方法。有什么建议我可以更好地解决这个问题吗?

报表处理程序体系结构问题

根据您的描述,如果您正在寻找比Factory更匹配的模式,请尝试策略:

策略模式

  1. 您的上下文可以是一个自定义类,用于封装和抽象不同的报告输入(您可以使用AbstractFactory模式用于此部分)
  2. 您的策略可以实现任意数量的不同查询过滤器或所需的附加逻辑。如果您将来需要更改系统,只需创建一个新策略就可以在报告工具之间切换

希望能有所帮助!

除了策略模式之外,您还可以为每个底层解决方案创建一个适配器。然后使用策略来改变它们。我已经构建了类似的解决方案,每个报告解决方案都由我所称的引擎支持。除了可变报告解决方案,我们还有可变存储解决方案——输出可以存储在SQL server或文件系统中。我建议使用一个容器,然后用正确的引擎初始化它,例如:

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上查看。