0

MVCアプリケーション用のカスタムキャッシュプロバイダーを作成しました。このクラスを使用して、セッションデータを外部サービス(memcachedやRedisなど)に保存/取得します。

アプリケーションの起動時にオブジェクトインスタンスを1回作成して、任意のコントローラーからオブジェクトを参照できるようにします。インスタンスを「更新」する必要があるのは1回だけです。Global.asaxApplication_Startメソッドでクラスをインスタンス化することを考えていました。ただし、どのコントローラーでもインスタンスにアクセスできないようです。

MVCで(グローバル)クラスをインスタンス化してからアクセスするための推奨される方法は何ですか?

これが私の「簡略化された」クラスのコピーです:

 public class PersistentSession : IPersistentSession
    {
        // prepare Dependency Injection
        public ICache cacheProvider { get; set; }

        public bool SetSessionValue(string key, string value)
        {
            return cacheProvider.PutToCache(key, value);
        }

        public bool SetSessionValue(string key, string value, TimeSpan expirationTimeSpan)
        {
            return cacheProvider.PutToCache(key, value, expirationTimeSpan);
        }

        public string FetchSessionValue(string key)
        {
            return cacheProvider.FetchFromCache(key);
        }
    }

アプリケーション全体のすべてのコントローラーからアクセスできるように、一度インスタンス化したいと思います。次のようになります。

 // setup PersistentSession object
 persistentSession = new PersistentSession();
 string memcachedAddress = WebConfigurationManager.AppSettings["MemcachedAddress"].ToString();
 string memcachedPort = WebConfigurationManager.AppSettings["MemcachedPort"].ToString();

 persistentSession.cacheProvider = new CacheProcessor.Memcached(memcachedAddress, memcachedPort);

すべてのコントローラーからグローバルアクセスを取得するには、MVCのどこ/どのようにオブジェクトをインスタンス化する必要がありますか?

4

1 に答える 1

1

問題が見えない!!

PersistentSession クラスのメソッドの定義に (static) キーワードを追加するだけです。

public class PersistentSession : IPersistentSession
{
    // prepare Dependency Injection
    public static ICache cacheProvider { get; set; }

    public static bool SetSessionValue(string key, string value)
    {
        return cacheProvider.PutToCache(key, value);
    }

    public static bool SetSessionValue(string key, string value, TimeSpan expirationTimeSpan)
    {
        return cacheProvider.PutToCache(key, value, expirationTimeSpan);
    }

    public static string FetchSessionValue(string key)
    {
        return cacheProvider.FetchFromCache(key);
    }
}

. どこからでも次のコードを使用してアクセスできます。

PersistentSession.SetSessionValue (key , value);

静的コンストラクターを追加して、メンバーにアクセスする前にフィールドを初期化することもできます。コンストラクターは、静的クラスのメンバーが初めてアクセスされる前に呼び出されるため、クラスが使用される前に設定されていることを確認できます。

public static PersistentSession ()
{
//Put your initializing code, for example:
cacheProvider = new CacheProvider();
}
于 2012-10-23T05:08:28.453 に答える