首页新闻找找看学习计划

关于asp.net core依赖注入的个疑问

0
悬赏园豆:50 [已解决问题] 解决于 2019-07-30 18:42

1,如果我使用net core自带的容器,是不是每个类都要手动绑定接口和类啊,如果有上百个,那岂不是很蛋疼,
2,还有就是当我收到一个请求时,是不是从前到后相关的注册过的依赖对象都会创建一遍对象啊,甚至有很多我用不到的对象也给创建了啊,这样明显感觉有性能浪费啊,感觉还不如直接用静态函数了,举个例子,假如我一个对象里有2个方法,A方法很简单,只是依赖了一个读取数据库的对象,但是另一个方法的执行,却依赖一大堆对象,这些对象又各自依赖一堆对象,那么当我调用这个对象时,这些上下相关的依赖对象都会被创建吧,这在http请求中感觉很可怕啊,不知道是不是我的理解错了,我想微软既然推出这个问题,理论应该不至于如此吧

求大佬解惑,谢谢啦先

WmW的主页 WmW | 初学一级 | 园豆:159
提问于:2019-06-13 17:27
< >
分享
最佳答案
1

先回答问题1,建议使用强大的DI容器自动化注册工具 Scrutor

推荐阅读:Using Scrutor to automatically register your services with the ASP.NET Core DI container

收获园豆:50
dudu | 高人七级 |园豆:40840 | 2019-06-13 17:33

回答问题2,通过构造函数依赖注入的接口或类都会创建对应的对象,构造函数依赖注入本来就是一种强依赖,如果很少用到的接口或类却通过构造函数注入,那就是设计问题。通常创建一个对象的开销不大,对性能的影响可以忽略。

dudu | 园豆:40840 (高人七级) | 2019-06-13 18:01

@dudu: 谢谢解答,我这还有个问题,容器对依赖对象的创建应该是通过反射的吧,我记得反射的性能很差,这个会产生影响吗,还有我看见ConfigureServices中的services.AddScoped可以传入一个委托,假如这样写string connString = Configuration.GetConnectionString("connString");
services.AddScoped<MySqlDBHelper>(org => {
return new MySqlDBHelper(connString);
});
这样的话,对象创建的时候还会使用反射吗,还是说会直接调用我这个匿名方法创建一个MySqlDBHelper对象从而避免使用反射

WmW | 园豆:159 (初学一级) | 2019-06-18 17:59

@WmW: 没有使用反射

dudu | 园豆:40840 (高人七级) | 2019-06-18 18:18
其他回答(3)
0

Autofac或者ninject

学会乐观 | 园豆:653 (小虾三级) | 2019-06-13 19:16
0

个人比较谨慎使用自动化注册机制,view代码的时候搞不清楚到底用了什么实现。@dudu 怎么看

czd890 | 园豆:7577 (大侠五级) | 2019-06-14 11:14
1

问题1.
系统框架提供的是基础api,可以自行封装更为高级的实现,例如可以通过反射的方式实现自动注入。网上也有很多通用的实现,例如一楼推荐的Scrutor

问题2.
上下文依赖的会创建,用不到的对象不会创建。就算不用依赖注入,依赖的对象该创建的对象还是得创建,这个开销并不是依赖注入带来的,依赖注入不会带来很大的额外开销。

天方 | 园豆:5264 (大侠五级) | 2019-06-17 00:22

谢谢解答,那依赖注入对象的创建是通过反射的吗,这个会产生性能浪费吗,有什么办法能避免使用反射吗,这样行吗
public void ConfigureServices(IServiceCollection services) {
string connString = Configuration.GetConnectionString("connString");
services.AddScoped<MySqlDBHelper>(org => {
return new MySqlDBHelper(connString);
});
}

支持(0) 反对(0) WmW | 园豆:159 (初学一级) | 2019-06-18 18:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册