2017-10-18 22 views
12

のCore 2我々はこのようAzureのRedisのキャッシュを追加することができます。ASP.NETコア2 - ASP.NETでは複数AzureのRedisのキャッシュサービスのDI

services.AddDistributedRedisCache(config => 
{ 
    config.Configuration = Configuration.GetConnectionString("RedisCacheConnection"); 
    config.InstanceName = "MYINSTANCE"; 
}); 

を次に使用量がこのようになります:

private readonly IDistributedCache _cache; 

public MyController(IDistributedCache cache) 
{ 
    _cache = cache; 
} 

どのようにしてありますように、私はそれを行うことができます。

private readonly IDistributedCache _cache1; 
private readonly IDistributedCache _cache2; 

public MyController(IDistributedCache cache1, IDistributedCache cache2) 
{ 
    _cache1 = cache1; 
    _cache2 = cache2; 
} 

私の質問どのように私は別のAzure Redisのキャッシュを指す別のサービスを追加することができます私はそれらを使用したいときに接続とインスタンスとそれらの分離を作る?シーンの背後に

+0

このような高度なシナリオは、デフォルトの 'IDistributedCache'のアプローチには本当に扱いではありません。 [CacheManager](http://cachemanager.michaco.net/)のようなライブラリを使用すると、型引数に基づいて異なるキャッシュを定義できます。 –

+2

潜在的なオプションは、[Strategy Pattern](https://stackoverflow.com/a/46597099)を使用して、実行時に使用するキャッシュを選択することです。 – NightOwl888

答えて

8

AddDistributedRedisCache()拡張メソッドは、(code on github)以下のん:

  1. レジスタアクションRedisCacheOptionsを設定します。あなたがAddDistributedRedisCache()に渡すラムダはその責任を負っています。 RedisCacheOptionsのインスタンスがRedisCacheのコンストラクタに渡され、IOptions<T>にラップされます。
  2. レジスタシングルトンの実装RedisCacheIDistributedCacheインターフェイス。

不幸なことに、これらの操作はどちらもあなたの求めるものには適していません。 特定のタイプのオプションを設定するために登録できるアクションは1つだけです。 .netコア依存性注入のネイティブ実装does not support登録オーバーライド。

あなたが望むことを実行するソリューションはまだあります。しかし、この解決策は幾分私を殺しています。

トリッキーは、カスタムRedisCacheOptions1、RedisCacheOptions2をRedisCacheOptionsから継承し、両方の設定を個別に登録することです。

次に、IDistributedCacheを継承するカスタムIDistributedCache1およびIDistributedCache2インターフェイスを定義します。

最後に、クラスRedisCache1(RedisCacheから実装を継承し、IDistributedCache1も実装)とRedisCache2(同じ)を定義します。このような

何か:

public interface IDistributedCache1 : IDistributedCache 
{ 
} 

public interface IDistributedCache2 : IDistributedCache 
{ 
} 

public class RedisCacheOptions1 : RedisCacheOptions 
{ 
} 

public class RedisCacheOptions2 : RedisCacheOptions 
{ 
} 

public class RedisCache1 : RedisCache, IDistributedCache1 
{ 
    public RedisCache1(IOptions<RedisCacheOptions1> optionsAccessor) : base(optionsAccessor) 
    { 
    } 
} 

public class RedisCache2 : RedisCache, IDistributedCache2 
{ 
    public RedisCache2(IOptions<RedisCacheOptions2> optionsAccessor) : base(optionsAccessor) 
    { 
    } 
} 

public class MyController : Controller 
{ 
    private readonly IDistributedCache _cache1; 
    private readonly IDistributedCache _cache2; 

    public MyController(IDistributedCache1 cache1, IDistributedCache2 cache2) 
    { 
     _cache1 = cache1; 
     _cache2 = cache2; 
    } 
} 

// Bootstrapping 

services.AddOptions(); 

services.Configure<RedisCacheOptions1>(config => 
{ 
    config.Configuration = Configuration.GetConnectionString("RedisCacheConnection1"); 
    config.InstanceName = "MYINSTANCE1"; 
}); 
services.Configure<RedisCacheOptions2>(config => 
{ 
    config.Configuration = Configuration.GetConnectionString("RedisCacheConnection2"); 
    config.InstanceName = "MYINSTANCE2"; 
}); 

services.Add(ServiceDescriptor.Singleton<IDistributedCache1, RedisCache1>()); 
services.Add(ServiceDescriptor.Singleton<IDistributedCache2, RedisCache2>()); 
+0

私は実際にあなたと同じ道にいました。あなたはどういう意味ですか?「しかし、この解決策はいくぶん私を殺しますか?私はこのアプローチで何か間違っているとは思わないし、私はうまく動作すると思う。 – user2818430

+1

私はそれがすべきはるかに多くの努力を必要とすることを意味します:( – CodeFuller

関連する問題