依存注入-1

4601 ワード

ここでは依存注入の基本概念を紹介していませんが、ここにはネット/公式サイトにたくさんあります.
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");
}