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

我希望有一个ReportHandler可以接受我的各种输入并吐出报告。此时,我没有看到任何其他方法,而是使用大型switch语句来处理基于reportName的每个报告。有什么建议我可以更好地解决这个问题吗?

有帮助吗?

解决方案

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

策略模式

  1. 您的上下文可以是一个自定义类,它封装和抽象不同的报表输入(您可以使用此部分的AbstractFactory模式)
  2. 您的策略可以实现任意数量的不同查询过滤器或所需的其他逻辑。如果您将来需要更改系统,只需创建新策略即可在报告工具之间切换。
  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委托工作到依赖引擎...

我们遇到了类似的问题,并采用了“连接器”的概念。这是主报表生成器应用程序和不同报表引擎之间的接口。通过这样做,我们能够创建“通用报告服务器”。应用。您应该在www.versareports.com上查看。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top