2009-09-19 4 views
5

私は、いくつかの異なるデータソースを索引付けした検索アプリケーションを構築しています。検索エンジンインデックスに対してクエリが実行されると、各検索結果は、それがどのデータソースから来たものかを指定します。私は、検索結果の種類ごとに異なるテンプレートを表示するために使用したファクトリパターンを作成しましたが、このパターンは、検索エンジンによって索引付けされるデータソースが増えるにつれて、管理が難しくなります新しいデータソースごとにコードテンプレートを作成する必要があります)。C#ファクトリパターン

私は維持するために、この検索アプリケーションに容易にするためにDotNetSlackers.com

factory pattern http://img11.imageshack.us/img11/8382/factoryi.jpg

オーバーグランビルバーネットによる記事のオフに基づいて、私の工場のために次のような構造を作成し、私の考えはセットを作成することでしたどのテンプレートを構築するかを決定するために私のファクトリパターンが参照できる個々のテンプレートタイプを定義するために使用できるデータベーステーブルを提供します。私は、検索結果のデータソースに基づいて構築するテンプレートのタイプを指定するためのルックアップテーブルを用意する必要があると考えました。私は、そのテンプレートの種類を表示するフィールドを指定するテーブルを持つ必要があります。また、そのフィールド(ハイパーリンク、ラベル、CssClassなど)のレンダリング方法を定義するために使用するテーブル(またはテンプレートテーブル内の追加の列)も必要です。

誰もこのようなパターンの例はありますか?私にお知らせください。 ありがとう、 -Robert

答えて

4

この提案されたソリューションは、現在のようにデータソースを単にコードテンプレートに関連付けるよりも、維持することはできません。実際には、テンプレートスキーマとレンダリング情報をデータベースにプッシュすることによって柔軟性を失い、アプリケーションのメンテナンスを難しくしていると言っても過言ではありません。

例えば、(私はこれを正しく理解していた場合)あなたが属性を持つこれらのデータソースがあると仮定してみましょう:あなたは、あなたの検索結果にこれらのデータソースのそれぞれの一方を有することができる

Document { Author, DateModified } 
Picture { Size, Caption, Image } 
Song { Artist, Length, AlbumCover } 

。各要素は別々にレンダリングされます(ピクチャは左に固定されたプレビュー画像でレンダリングされるか、ソングはアルバムカバーなどを表示できます)

提案されたデザインのレンダリングを見てみましょう。レンダリングのデータベースを照会し、出ているHTMLを調整します。たとえば、ドキュメントの緑の背景とピクチャの青の背景が必要な場合があります。議論のために、あなたが実際にSongのための3つの背景色、Pictureのための2つの色、そしてDocumentsのための3つの背景色を本当に必要としていると考えてみましょう。ここでは、レンダリング値を適用するパラメータ化されたテンプレートを変更するだけでなく、プロモートおよびプッシュされるデータベーススキーマの変更についても検討しています。

ドキュメントの結果にドロップダウンコントロールが必要で、ピクチャにはいくつかのボタンが必要で、ソングにサウンドプレーヤーのコントロールが必要であると判断したとします。今すぐデータソースごとの各テンプレートが大幅に変更されるので、開始した場所に戻ることができます。

柔軟性が失われたのでデータソースごとに異なるテンプレートを定義します。あなたが失うもう1つの点は、テンプレートをソース管理でバージョン管理していることです。

放出されたビューで共通の要素/コントロールを再利用する方法を検討しますが、テンプレートとデータソースの間のファクトリでマッピングを保持し、テンプレートをデータソースごとに別々のファイルとして保持します。CSSや同様の設定でレンダリングを維持してください。マッピングを単純なXMLファイルとしてエクスポートすることを検討して、メンテナンスを容易にします。新しいデータソースを展開するには、マッピングを追加し、適切なテンプレートとCSSファイルを作成して、それらを予定された場所にドロップするだけです。以下のコメントへ

応答:

あなたは出力に与えられたテンプレートをロジックを持つ
switch (resultType) 
{ 
    case (ResultType.Song): 
     factory = new SongResultFactory(); 
     template = factory.BuildResult(); 
     break; 
    // ... 

を:

私は、単純なswitch文で十分です意味。あなたが長いswitch文よりもコンパクトな何かをしたい場合は、このように、辞書内のマッピングを作成することができます。

IDictionary<ResultType, ResultFactory> TemplateMap; 
mapping = new Dictionary<ResultType, ResultFactory>(); 
mapping.Add(ResultType.Song, new SongResultFactory()); 
// ... for all mappings. 

を代わりにswitch文の後、あなたはこのワンライナーを行うことができます

template = TemplateMap[resultType].CreateTemplate(); 

主な議論は、ある時点では、データベース、大きなswitch文、またはこのIDictionaryインスタンスのいずれかを初期化する必要があるということです。

あなたはさらにそれを取ると中に読んだ、単純なXMLファイルでマッピングを格納することができます:

<TemplateMap> 
    <Mapping ResultType="Song" ResultFactoryType="SongResultFactory" /> 
    <!-- ... --> 
</TemplateMap> 

と反射らを使用しています。 al。 IDictionaryにデータを設定します。あなたはまだマッピングを維持していますが、今は展開が容易なXMLファイルになっています。

+0

説明を再度ありがとう。別の目と意見を得ることはいつも良いことです!あなたの考えは私にいくつかの考えを考えさせてくれました。再度、感謝します。 - ロバート –

関連する問題