首页新闻找找看学习计划

.Net core 依赖注入的理解

0
悬赏园豆:5 [已解决问题] 解决于 2018-09-28 17:05

在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(); 这时候需要一个构造参数,对依赖注入的理解不知道有没有走入误区了,求大神讲解下

DNLi的主页 DNLi | 菜鸟二级 | 园豆:352
提问于:2018-09-11 20:44
< >
分享
最佳答案
0

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 的痛苦。

收获园豆:5
dudu | 高人七级 |园豆:39111 | 2018-09-11 22:00

很感谢 @dudu 的讲解 我有一点理解了,我是在 一个公用的Com层创建了 IRedisHelper 和 redisHelper ,在homecontroller 下通过构造注入是可以实现,但是我想在另外一个层 BLL 层里面进行redisHelper的调用,这样我必须在要使用的类 的构造函数中进行注入 才可调用,感觉这样子好像更麻烦了

DNLi | 园豆:352 (菜鸟二级) | 2018-09-12 08:57

@DNLi: 要现在的小麻烦还是要以后的大麻烦,你看着办吧

dudu | 园豆:39111 (高人七级) | 2018-09-12 10:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册