2012-02-22 4 views
3

MVC + EFをスローガンし、正しいことに集中しようとしています。今はフォームにドロップダウンを追加しようとしていますが、ページが読み込まれるたびにデータベースにアクセスしないようにして、データをアプリレベルで保存したいと考えています。私は、アプリケーションレベルの変数を作成するのが最善の方法ではないと考えています。私はキャッシュと静的ユーティリティー機能の使用について読んだことがありますが、驚くべきことに、何も決定的には聞こえませんでした。 、基本的な検索(悪いMVCのアプリレベルでデータベースに保存された参照データを永続化するためのベストプラクティス

をキャッシュするユニットテストのための悪い静的クラスは、だから、私は好奇心だ2つのシナリオ、私はアプローチが2つの間で異なるかどうかわからない。

1を持っています) 50州を考えてみましょう。小さい、定義された、決して変更されません。アプリケーションの起動時に読み込みます。 (ハードコーディングされたソリューションではなく、データベースからの検索は必要ありません。)

2)検索はほとんど変更されず、管理者のような画面でのみ可能です。あなたの製品が販売されている都市/店舗を考えてみましょう。データは に格納されますが、誰かがアプリケーションで変更を加えない限り、比較的静的になります。だから私はドロップダウンリストボックスを作成する必要があるたびにデータベースをヒットしようとしていません。

は基本的なもののように思えるが、それは基本的には答えませんでした、このトピックのと同じです:

Is it good to use a static EF object context in an MVC application for better perf?

すべてのヘルプは高く評価されています。

答えて

2

私はいくつかの部分で質問します。まず、MVCで静的変数やキャッシングパターンを使用するのは本質的に悪いですか?答えは単純にいいえではありません。あなたのアーキテクチャがそれらをサポートしている限り、それは問題ありません。キャッシュを適切な場所に配置し、後で説明するようにテスト容易性を設計してください。

2番目の部分は、このタイプの永続化されたデータを格納するための「正しい」方法であり、一般的なUIアイテムを作成するためにDBを巡回する必要はありません。このため、EFオブジェクトの格納はお勧めしません。あなたがキャッシュするPOCOオブジェクト(Viewモデルなど)を作成します。だからあなたの50州の例では、あなたがこのようなものかもしれません:

public class State 
{ 
    public string Abbreviation { get; set; } 

    public string Name { get; set; } 
} 

を次に、あなたのキャッシュされたリストを作成するには、このような何かをするだろう:

List<State> states = Context.StateData.Select(s => new State { Abbreviation = s.Abbreviation, Name = s.Name}).ToList(); 

最後に、何でもあなたのキャッシング・ソリューションは、ありますテストのためにそのキャッシングメソッドをモックできるように、インターフェイスを実装する必要があります。

循環参照に実行しているか、リフレクションを使用せずにこれを行うには、あなたは少なくとも3つのアセンブリが必要となります。

あなたのMVCアプリケーション あなたPOCOオブジェクトを定義するためのクラスライブラリとインタフェース クラスライブラリは、あなたのデータを実行しませんアクセスとキャッシング(これは明らかにそれはそれが簡単に維持できる場合は2つのライブラリに分割および/またはテストすることができます)

あなたはMVCコードでこのような何かを持っている可能性がありその方法:

ICache myCache = CacheFactory.CreateCache(); 
List<State> states = myCache.ListStates(); 
// populate your view model with states 

ICacheとStateは1つのライブラリにあり、ICacheの実際の実装は別のライブラリにあります。

これは私の標準的なアーキテクチャのためのものです.POCOオブジェクトとデータアクセスに依存しないインタフェースを別のライブラリに分割することです。これは、MVCアプリケーションとは別のデータアクセスです。

+0

技術的には、POCOクラスをデータアクセスレイヤーにキャッシュメカニズム用のインターフェイスとして配置することができます。次に、MVCアプリケーションでキャッシュを実装してインターフェイスを実装し、データアクセスレイヤーに渡すだけです。dataLayer.LoadStates(myCache)ここで、ICacheはプロパティリストまたはメソッドを公開して、 。 –

0

ユニティ、ninject、構造マップなどの依存性注入ツールを使用してください。これらのツールを使用すると、オブジェクトに保持されているカーネルを非常に似た方法で実装することで、記述しているようです。

+0

私は自分のプロジェクトでNinjectを使用しています。しかし、DIはアプリケーションレベルでデータをキャッシュする必要があるとは思っていませんでした。私はそれを間違っていますか? –

関連する問題