2011-12-06 12 views
1

IDとオブジェクトの間のマッピングにはどのような方法が最適ですか? については、例は、プロパティPreferenceId <を有するOrderItemPreferenceクラスを有し、idおよびPreferenceを有する。私は、環境設定をキャッシュから読み込まず、データベースを照会しないようにします。辞書から環境設定オブジェクトを取得するにはpreferencesDictionary [id]のようにします。それぞれの製品のデータベースを照会するのは遅いです。それぞれの製品はグループごとに3〜4の優先順位を持っているため、あまりにも多くのデータを扱うことになります。POCO用のシンプルなキャッシュの実装

私はORMを使用したくありません。

最も単純な解決策は、POCOのプロパティにcache.Butから読み取るコードを埋め込むことですが、これは私にとっては正しいとは思われません。どのようにこれを達成するための解決策?

答えて

3

のは、あなたがリポジトリパターン(あなたがする必要はありませんが、アイデアは、他のデータ・アクセス・パターンについても同様である)を使用しているとしましょう:

interface IPocoRepository { 
    Poco GetById(int id); 
} 

class DatabasePocoRepository : IPocoRepository { 
    public Poco GetById(int id) { 
     // read the POCO from the database 
    } 
} 

class CachePocoRepository : IPocoRepository { 
    private readonly IPocoRepository pocoRepository; 
    public PocoCachingRepository(IPocoRepository pocoRepository) { 
     this.pocoRepositry = pocoRepository; 
    } 

    public Poco GetById(int id) { 
     // read from the cache 
     // if available, return it 
     // if not, load using pocoRepository and cache 
    } 
} 

そして今、どこでも、あなたがPocoRepositoryを必要としたいということをキャッシングを有効にするには、CachingPocoRepositoryを使用します。明らかに、キャッシュポリシーを書く必要があります。

+0

パターンありがとうございますが、私の質問はどのように呼び出すかです。たとえば、Order.TableIdを使用して、キャッシュからテーブルオブジェクトを返すためにOrder.Table <とTableを呼び出したいとします。このコードはどこに置くべきですか?それはプロパティ(テーブル)の中に入れて良いですか? 。手動でコードにロードすると、複雑さが増します。ループのように、コードを追加して各項目がロードされているとコードが複雑すぎるかどうかをチェックするようにレポートを作成するのと同じように。 – GorillaApe

+0

WHOLEポイントは、キャッシュがPOCOオブジェクトの性質と密接に関連していない点です。それはデータアクセスに密接な関係にあり、コードはどこにあるべきですか。データアクセスコードでは、データアクセスレイヤーで消費します。 – jason

+0

私はデータをロードするDAOコードにそれを置く必要があります。 – GorillaApe

関連する問題