1,如果我使用net core自带的容器,是不是每个类都要手动绑定接口和类啊,如果有上百个,那岂不是很蛋疼,
2,还有就是当我收到一个请求时,是不是从前到后相关的注册过的依赖对象都会创建一遍对象啊,甚至有很多我用不到的对象也给创建了啊,这样明显感觉有性能浪费啊,感觉还不如直接用静态函数了,举个例子,假如我一个对象里有2个方法,A方法很简单,只是依赖了一个读取数据库的对象,但是另一个方法的执行,却依赖一大堆对象,这些对象又各自依赖一堆对象,那么当我调用这个对象时,这些上下相关的依赖对象都会被创建吧,这在http请求中感觉很可怕啊,不知道是不是我的理解错了,我想微软既然推出这个问题,理论应该不至于如此吧
求大佬解惑,谢谢啦先
先回答问题1,建议使用强大的DI容器自动化注册工具 Scrutor
推荐阅读:Using Scrutor to automatically register your services with the ASP.NET Core DI container
回答问题2,通过构造函数依赖注入的接口或类都会创建对应的对象,构造函数依赖注入本来就是一种强依赖,如果很少用到的接口或类却通过构造函数注入,那就是设计问题。通常创建一个对象的开销不大,对性能的影响可以忽略。
@dudu: 谢谢解答,我这还有个问题,容器对依赖对象的创建应该是通过反射的吧,我记得反射的性能很差,这个会产生影响吗,还有我看见ConfigureServices中的services.AddScoped可以传入一个委托,假如这样写string connString = Configuration.GetConnectionString("connString");
services.AddScoped<MySqlDBHelper>(org => {
return new MySqlDBHelper(connString);
});
这样的话,对象创建的时候还会使用反射吗,还是说会直接调用我这个匿名方法创建一个MySqlDBHelper对象从而避免使用反射
@WmW: 没有使用反射
Autofac或者ninject
个人比较谨慎使用自动化注册机制,view代码的时候搞不清楚到底用了什么实现。@dudu 怎么看
问题1.
系统框架提供的是基础api,可以自行封装更为高级的实现,例如可以通过反射的方式实现自动注入。网上也有很多通用的实现,例如一楼推荐的Scrutor
问题2.
上下文依赖的会创建,用不到的对象不会创建。就算不用依赖注入,依赖的对象该创建的对象还是得创建,这个开销并不是依赖注入带来的,依赖注入不会带来很大的额外开销。
谢谢解答,那依赖注入对象的创建是通过反射的吗,这个会产生性能浪费吗,有什么办法能避免使用反射吗,这样行吗
public void ConfigureServices(IServiceCollection services) {
string connString = Configuration.GetConnectionString("connString");
services.AddScoped<MySqlDBHelper>(org => {
return new MySqlDBHelper(connString);
});
}
不要迷失了技术用在对的地方,.net core 天生带 DI 是 有更多的选择, 你也完全可以按照以前 new的方式去实现, DI用在频繁 或者更抽象的设计上, 其实很多系统,目前绝大多数 写web是不需要注入的,因为写注入你必须要写一层接口来 拉拢 两端,你理解的没错,它会有更多的对象,起码有自己的生命周期管理那些、
1、注入 用在大型项目中,大型团队。一个项目发布需要很长的时间,而且组件又需要频繁更新,自己的子集有自己的团队维护,这样才能发挥到极致,我们可以做到热更新
2、更抽象的发展,比如你写了一个核心软件,简单来说,比如一个音乐软件,有很多皮肤,但是官方只有几个,然后公开接口。其它人根据你的约束 可以做自己想自己的,而不用关心核心 的
3、依赖注入 就是反射 它应该使用更快的 emit 来处理
最后小声BB一句,学好基础是最好的,新的很多所谓的技术 很多年就有原型了,只不过现在起了个高大上的名称,当然入门更低使用罢了, 再则用技术 。对于新的计算开发人员一定要去了解。哪怕你没时间学,知道有这个都行,还有技术别乱用,一定要看什么业务用什么技术最合适 才是最好的。