码迷,mamicode.com
首页 > 其他好文 > 详细

依赖注入-1

时间:2020-05-22 11:20:41      阅读:44      评论:0      收藏:0      [点我收藏+]

标签:标识   csr   class   val   err   style   方案   add   single   

这里不在介绍依赖注入的基本概念,这里网上/官网上面有很多。

一个接口多个实现依赖注入的问题?

方案1:

这里通过区分标识就可以了.

如:

public interface IRedisMessage
{
    T Get<T>(string key);   
}

public class CSRedis:IRedisMessage
{
   public T Get<T>(string key)
   {
      return RedisHelper.Get<T>(key);
   }
}
public class  StackExchangeRedis:IRedisMessage
{
   public T Get<T>(string key)
   {
      return db.StringGet(key);
   }
}

在服务注册的时候 ConfigureServices中

//这里我们需要这样写,常规写法就是正常的服务注册,这里不在写。直接写方案

services.AddSingleton<IRedisManager,CSRedis>(); 
services.AddSingleton<IRedisManager,StackExchangeRedis>();
services.AddSingleton(factory => { Func< string, IRedisManager> accesor = key => { if(key.Equals( "CSRedis")) {   return factory.GetService<CSRedis>();
} else if(key.Equals(
"StackExchangeRedis")) {   return factory.GetService<StackExchangeRedis>();
}
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<IRedisMananger > redisMessages){ 
 _iRedisA= redisMessages.FirstOrDefault(h=>h.GetType(),Name--"CSRedis"); 
_iRedisB= redisMessages.FirstOrDefault(h=>h.GetType(),Name--"StackExchangerRedis");
} 

 

依赖注入-1

标签:标识   csr   class   val   err   style   方案   add   single   

原文地址:https://www.cnblogs.com/ccaa/p/12936001.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!