2

実行時に ServiceStack アプリケーションで使用されるキャッシュ クライアントを (おそらくアプリ/Web 構成を通じて) 変更したいと思います。

たとえば、私は現在これを持っています:

 container.Register<ICacheClient>(new MemoryCacheClient());

実行時にこれを Redis ICacheClient の使用法に変更したいと思います。2 つのコンテナー (1 つのメモリと Redis) が登録されている場合はどうなるでしょうか。私のサービスで次のような呼び出しで実行時にコンテナを切り替えることは可能ですか:

    public object Get(FooRequest request)
    {
        string cacheKey = UrnId.CreateWithParts("Foo", "Bar");
        return RequestContext.ToOptimizedResultUsingCache(base.Cache, cacheKey, sCacheDuration, () =>
            {
                return TestRepository.Foos;
            });
    }

編集:

さらに調査した結果、複数の ICacheClient が登録されている場合は次のようになります。

        container.Register<IRedisClientsManager>(c => new PooledRedisClientManager("localhost:6379"));
        container.Register(c => c.Resolve<IRedisClientsManager>().GetCacheClient());
        container.Register<ICacheClient>(new MemoryCacheClient());

次に、サービス内で base.Cache にアクセスすると、登録された最新の ICacheClient が返されます...つまり、上記の場合は MemoryCacheClient.

したがって、サービス内から Cache オブジェクトにアクセスできるので、登録したキャッシュから特定の Cache を取得する方法が必要になりますが、プロパティが表示されません。

4

2 に答える 2

1

このようなことを行うと、Web 構成設定に基づいてコンテナーにさまざまなプロバイダーを登録できます。

var redisCacheString = ConfigurationManager.AppSettings["UseRedis"];
var useRedis = false;
if (!bool.TryParse(redisCacheString, out useRedis))
{
  container.Register<IRedisClientsManager>(c => new PooledRedisClientManager("localhost:6379"));
  container.Register(c => c.Resolve<IRedisClientsManager>().GetCacheClient());
}
else
{
  container.Register<ICacheClient>(new MemoryCacheClient());
}

それが役立つことを願っています!

于 2013-09-05T02:24:35.510 に答える
0

複合ルートに単純に登録するだけでなく、より柔軟性が必要になると思われます。コンテナー登録で複合パターンを実装してみてください。

スティーブンは単純なインジェクターを使用してこのパターンを説明していますが、SSまたはその他のIOCが提供するOOBで実装できると思います

それが役立つことを願っています

于 2013-09-13T17:22:44.303 に答える