3

レポートの作成を処理する ReportHandler サービスを使用しようとしています。レポートには、設定可能なパラメータの数が異なる複数のパラメータを含めることができます。システムには現在、レポートを作成するいくつかの異なる方法 (MS レポート サービス、html レポートなど) があり、レポートごとにデータを生成する方法が異なります。すべてを ActiveReports に統合しようとしています。システムを変更してパラメーターを変更することはできないため、結果を生成するために本質的に where 句を取得する場合もあれば、結果を生成するために使用する必要があるキーと値のペアを取得する場合もあります。factory パターンを使用することも考えましたが、クエリ フィルターの数が異なるため、これは機能しません。

さまざまな入力を受け取り、レポートを吐き出す単一の ReportHandler があればいいのにと思います。現時点では、大きな switch ステートメントを使用して reportName に基づいて各レポートを処理する以外に方法はありません。これをよりよく解決する方法について何か提案はありますか?

4

3 に答える 3

3

あなたの説明から、ファクトリーよりもよく一致するパターンを探しているなら、戦略を試してください:

戦略パターン

  1. コンテキストは、さまざまなレポート入力をカプセル化して抽象化するカスタムクラスにすることができます(この部分にはAbstractFactoryパターンを使用できます
  2. 戦略では、必要なさまざまなクエリフィルターまたは追加のロジックいくつでも実装できます。また、将来システムを変更する必要がある場合は、新しい戦略を作成するだけでレポートツールを切り替えることができます。

お役に立てば幸いです。

于 2008-10-10T18:40:00.843 に答える
3

戦略パターンに加えて、基盤となるソリューションごとに 1 つのアダプターを作成することもできます。次に、戦略を使用してそれらを変化させます。私はエンジンと呼ばれるものによってサポートされている各レポート ソリューションと同様に構築しました。可変レポート ソリューションに加えて、可変ストレージ ソリューションもあります。出力は 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 に答える