3

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

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

4

3 回答 3

3

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

策略模式

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

希望有帮助!

于 2008-10-10T18:40:00.843 回答
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 将工作委托给依赖引擎...

于 2008-10-11T13:16:30.870 回答
0

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

于 2009-09-14T00:15:20.063 回答