レポートハンドラーアーキテクチャの質問
-
08-07-2019 - |
質問
レポートの作成を処理するReportHandlerサービスを使用しようとしています。レポートには、設定可能な複数の異なる数のパラメーターを含めることができます。現在、システムにはレポートを作成するいくつかの異なる方法(MSレポートサービス、htmlレポートなど)があり、各レポートのデータの生成方法は異なります。すべてをActiveReportsに統合しようとしています。システムを変更してパラメーターを変更することはできないため、場合によっては結果を生成するためにwhere句を本質的に取得し、別の場合は結果を生成するために使用する必要があるキーと値のペアを取得します。ファクトリパターンの使用を考えましたが、クエリフィルターの数が異なるため、これは機能しません。
さまざまな入力を受け取り、レポートを出力する単一のReportHandlerが必要です。この時点では、大きなswitchステートメントを使用して、reportNameに基づいて各レポートを処理する以外の方法はありません。これをより良く解決する方法はありますか?
解決
説明から、Factoryよりもよく一致するパターンを探している場合は、戦略を試してください:
- コンテキストは、さまざまなレポート入力をカプセル化および抽象化するカスタムクラスにすることができます(この部分にはAbstractFactoryパターンを使用できます)
- あなたの戦略は、必要な数の異なるクエリフィルタまたは追加のロジックを実装できます。また、将来システムを変更する必要がある場合は、新しい戦略を作成するだけでレポートツールを切り替えることができます。
役立つことを願っています!
他のヒント
戦略パターンに加えて、基礎となるソリューションごとに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デリゲートは、依存するエンジンに作業します...
同様の問題があり、「コネクタ」の概念を採用しました。これは、メインレポートジェネレータアプリケーションとさまざまなレポートエンジンとの間のインターフェイスです。これにより、「ユニバーサルレポートサーバー」を作成することができました。応用。 www.versareports.comで確認してください。