依存注入-1
4601 ワード
ここでは依存注入の基本概念を紹介していませんが、ここにはネット/公式サイトにたくさんあります.
1つのインタフェースの複数の依存注入を実現する問題?
シナリオ1:
ここでは識別標識を区別すればよい.
次のようになります.
サービス登録時にConfigureServicesで
具体的な実装
シナリオ2:
1つのインタフェースの複数の依存注入を実現する問題?
シナリオ1:
ここでは識別標識を区別すればよい.
次のようになります.
public interface IRedisMessage
{
T Get(string key);
}
public class CSRedis:IRedisMessage
{
public T Get(string key)
{
return RedisHelper.Get(key);
}
}
public class StackExchangeRedis:IRedisMessage
{
public T Get(string key)
{
return db.StringGet(key);
}
}
サービス登録時にConfigureServicesで
// , , 。
services.AddSingleton();
services.AddSingleton();
services.AddSingleton(factory => { Func< string, IRedisManager> accesor = key => {
if(key.Equals( "CSRedis")) {
return factory.GetService();
}
else if(key.Equals("StackExchangeRedis"))
{
return factory.GetService();
}
else{
thrownewArgumentException($ "Not Support key : {key}");
} };
return accesor;
});
具体的な実装
private IRedisMananger _iRedisA;
private IRedisMananger _iRedisB;
privatereadonlyFunc< string, IRedisMananger > _serviceAccessor;
publicValuesController(Func<string, IDemoService> serviceAccessor){ this._serviceAccessor = serviceAccessor;
_iRedisA= _serviceAccessor( "CSRedis");
_iRedisB= _serviceAccessor( "StackExchangerRedis");
}
シナリオ2:
private IRedisMananger _iRedisA;
private IRedisMananger _iRedisB;
publicValuesController(IEnumber redisMessages){
_iRedisA= redisMessages.FirstOrDefault(h=>h.GetType(),Name--"CSRedis");
_iRedisB= redisMessages.FirstOrDefault(h=>h.GetType(),Name--"StackExchangerRedis");
}