龙空技术网

什么是IOC和DI?在asp.net core中是怎么实现的?

墨汁软件 68

前言:

目前你们对“php ioc di”可能比较着重,你们都想要剖析一些“php ioc di”的相关知识。那么小编也在网上汇集了一些关于“php ioc di””的相关文章,希望同学们能喜欢,朋友们一起来了解一下吧!

这篇文章我将会和大家聊一聊IOC(控制反转)和DI(依赖注入),以及dotnet core中是怎么实现DI。

IOC,中文翻译为控制反转,是不是一个很晦涩的名字?我们先来看一下比较官方的定义:

面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。

从上面我们提取到几点重要的信息。

1.IOC是一种设计思想,它的一种实现方式叫DI。

2.作用是降低代码耦合度。

那为啥会出现这种设计思想呢?

那就不得不说,现在的高级开发语言,基本上就会离不开接口设计。接口设计的原意是让大家在编写类时,先定义一个规范和准则,以便大家编写父子类,供外部调用的方法名称都是一致的。这样,我们在修改类或者继承类重新开发的时候,外部调用不会有太大的更改。

这样,大家调用类的方法时就变成了这样。

IInterfaceA instance = new ClassA();instance.CallMethod();

接口的出现,极大的方便了我们协作开发。比如你要重写类ClassA,名字叫ClassB,可以,但是要按照规则来,定义一个方法叫CallMethod。这样就减少了代码的改动量。

虽然,接口让我们开发的时候形成约束,但是其中还是有些问题!

在我们实例类的时候,是不是还是要去所有代码里面找将ClassA更改为ClassB呢?这种就叫耦合。耦合机械行业指不同的机械啮合在一起,进行驱动,可以看到它非常重要。但是,在软件行业,就让人不太受欢迎。因为我们都希望自己的软件高内聚,低耦合。

于是,就出现了IOC的设计思想。我不在代码里面new对象,将new对象的事情放到一个容器里面,只告诉容器一次IInterfaceA对应的实例对象是ClassA。在使用到InterfaceA的地方,都帮我们自动new ClassA()。这样我们就完成了解耦,修改一个地方,就完成了对象的替换。

下面我们来看看asp.net core是如何实现依赖注入的。先看一张图。

在Startup.cs文件中,我们可以看到一个方法。

public void ConfigureServices(IServiceCollection services){}

IServiceCollection就是一个容器的接口,它的实现是ServiceCollection,我们可以看一下源码:

通过静态方法,我们就可以往容器里面增加我们要注入接口,以及对应需要实例化的类。

那这个是怎么实现类实例的呢?dotnet core的容器提供了一个ServiceProvider类。ServiceProvider类会把ServiceCollection的ServiceDescriptor作为构造参数包含在里面。

最后,ServiceProvider暴露了方法GetService。可以看到,其核心就是IServiceProviderEngine。

好了,IOC和DI的内容就聊到这里。不算很深入,还有很多疑问。比如asp.net core mvc在什么时候对我们的Controller里面的类进行实例化的?还要深入的研究一下IServiceProviderEngine。感兴趣的小伙伴,可以去看看源码。

还有一点,dotnet core 原生的DI容器,只能实现构造函数的注入,不能实现属性的注入和方法的注入,需要的话,需要替换成autofac!有时间,我在来和大家聊一聊其他两种注入方式。

如果你觉得我的文章还不错,欢迎点赞,关注,转发和评论。大家也可以在微信公众号搜索"墨汁软件"关注我哟!

标签: #php ioc di #iocnetmvc