3

orm ロジックをカプセル化する必要があるクラス ライブラリがあります。一部の db 呼び出しを回避するには、ある種のキャッシュまたは静的変数を含める必要があります (それらを回避したい)。asp.net および wcf アプリケーションで使用されます。クラス ライブラリなので、Cache やその他の asp.net 関連のものにはアクセスしたくありません。また、アプリケーション スコープの性質上、静的変数も避けたいと考えています。

それをどのように実装すればよいですか?これを達成するために何をしますか?

編集:

簡単に言うと、DAL をカプセル化するクラス ライブラリを想像してみてください。データベースと通信します。内部にはコストのかかるクエリがいくつかあります。それらの一部は、ユーザーごとに一度フェッチしてどこかに保存する必要があり、一部はアプリケーションごとに使用できます (DB への将来の呼び出しを避けるためにも保存されます)。問題は、通常はキャッシュを使用することですが、これは DAL クラス ライブラリであるため、この機能を (asp.net ではなく) 内部に含めたいと考えています。それが今より明確になることを願っています;)

4

1 に答える 1

2

キャッシュを使用する必要があります。

パターン、インターフェースなどを使用する:

クラス ライブラリは疎結合にする必要があります。(交換が容易で相互参照なし)

例(私がやっている方法を簡略化):

namespace MyDbContext
{
    var cache;
    var db;

    public MyDbContext()
    {
        // Cache init
        cache = ....;

        // DB init (can be factory or singleton)
        db = DataBase.Instance();
    }

    public class Car
    {
        // Db tuple id
        public CarId { get; set; }

        public Car(int id)
        {
             CarId = id;
        }

        public Car GetFromDb()
        {
            // your db code will be here
            Car myCar = ....;

            // cache your object
            cache.Put("Car" + CarId.ToString(), myCar);
            return myCar;
        }

        public Car Get()
        {
            // try to get it from cache or load from db
            Car mycar = cache.Get("Car" + CarId.ToString()) as Car ?? GetFromDb();
        }

        public ClearCache()
        {
            cache.Put("Car" + CarId.ToString(), null);
            // maybe cache.Remove("Car" + CarId.ToString())
        }
    }
}
于 2010-07-29T17:43:22.350 に答える