Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 报表处理程序体系结构问题_C#_Asp.net_Report_Activereports - Fatal编程技术网

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

C# 报表处理程序体系结构问题,c#,asp.net,report,activereports,C#,Asp.net,Report,Activereports,我正在尝试使用ReportHandler服务来处理报表创建。报告可以设置多个不同数量的参数。在系统中,目前有几种不同的创建报告的方法(MS reporting services、html报告等),每个报告生成数据的方式也不同。我正在尝试将所有内容整合到ActiveReports中。我无法更改系统和参数,因此在某些情况下,我基本上会获得一个where子句来生成结果,在另一种情况下,我将获得必须用于生成结果的键/值对。我曾考虑过使用工厂模式,但由于查询过滤器的数量不同,这是行不通的 我希望有一个单一

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


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

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

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

  • 希望有帮助

    除了策略模式之外,您还可以为每个底层解决方案创建一个适配器。然后使用策略来改变它们。我已经构建了类似的报表解决方案,每个报表解决方案都由我所谓的引擎支持,除了可变报表解决方案之外,我们还有可变存储解决方案—输出可以存储在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{
    公共报告容器(IReportEngine报告引擎、IStorageEngine存储、IDeliveryEngine交付…)
    }
    }
    ///在服务层中,您可以确定要使用哪些引擎
    //或者使用一堆if语句/Factory/config。。。
    IReportEngine rptEngine=EngineFactory.GetEngine(传入一些值)
    IStorageEngine stGenEngine=EngineFactory.GetEngine(传入一些值)
    IDeliverEngine delEngine=EngineFactory.GetEngine(传入一些值)
    ReportContainer currentContext=新的ReportContainer(rptEngine、stGenEngine、delEngine);
    

    然后ReportContainer将工作委托给相关引擎…

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