在startup.cs 里面 是这么写的
services.AddSingleton<IRedisHelper, RedisHelper>();
这时候算不算已经注入容器了,
但是我在homecontroller 里面
var services = new ServiceCollection();
var provider = services.BuildServiceProvider();
provider是为空的,想知道容器是不是只有一个
还有在redis的帮助类中,使用IDistributedCache 是不是一定要这么写
public class RedisHelper : IRedisHelper
{
IDistributedCache _rediscache;
const double defaultExpiryTime = 10080;
public RedisHelper(IDistributedCache distributedCache)
{
_rediscache = distributedCache;
}
}
现在的问题是 如果这么写,那我在其他地方要调用 RedisHelper这个类的时候,像这样
var redishelper=new RedisHelper(); 这时候需要一个构造参数,对依赖注入的理解不知道有没有走入误区了,求大神讲解下
services.AddSingleton()
是注册到根容器,根容器是全局的,只有一个,但非根容器有很多,推荐阅读园子里 artech 的博文 依赖注入[8]: .NET Core DI框架[服务消费]
services.BuildServiceProvider()
创建的是一个新的容器,需要重新注册才能解析。
是走入误区了,用了依赖注入,却又倒退到 new
。既然使用了依赖注入,就可以不需要 new ,将 RedisHelper 注册到容器,然后通过构造函数注入 RedisHelper 的实例就可以。你已经注册好了 RedisHelper ,现在只需通过 HomeController 的构造函数注入即可:
public class HomeController : Controller
{
private readonly IRedisHelper _redisHelper;
public IActionResult Index(IRedisHelper redisHelper)
{
_redisHelper = redisHelper;
return View();
}
}
如果你一定要 new ,你还是需要通过构造函数注入 IDistributedCache 的实例
public class HomeController : Controller
{
private readonly IRedisHelper _redisHelper;
public IActionResult Index(IDistributedCache distributedCache)
{
_redisHelper = new RedisHelper(distributedCache);
return View();
}
}
除非你有办法直接 new 出 IDistributedCache 的实例。
而依赖注入就是为了解决 new 的痛苦。
很感谢 @dudu 的讲解 我有一点理解了,我是在 一个公用的Com层创建了 IRedisHelper 和 redisHelper ,在homecontroller 下通过构造注入是可以实现,但是我想在另外一个层 BLL 层里面进行redisHelper的调用,这样我必须在要使用的类 的构造函数中进行注入 才可调用,感觉这样子好像更麻烦了
@DNLi: 要现在的小麻烦还是要以后的大麻烦,你看着办吧