浅谈ASP.NET Core中IOC与DI的理解和使用
说起IOC和DI,使用过ASP.NET Core的人对这两个概念一定不陌生,早前,自己也有尝试过去了解这两个东西,但是一直觉得有点很难去理解,总觉得对其还是模糊不清,所以,趁着今天有空,就去把两个概念捋清楚,并将学习过程的知识点记录下来。
一、IOC和DI的理解
1.1 什么是IOC?
Ioc—Inversion of Control,即控制反转,其是一种设计思想,而不是一种技术。再没有使用IOC之前,我们一般是通过new来实例化,从而创建一个对象。但是我们使用IOC之后,创建这个对象的控制权将由内部转换到外部,那么这个过程便可以理解为控制反转。
1.2 什么是DI(依赖注入)?
全称为Dependency Injection,意思自身对象中的内置对象是通过注入的方式进行创建。形象的说,即由容器动态的将某个依赖关系注入到组件之中。
1.3 IOC和DI的联系?
●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)
1.4 为啥需要反转?
1.5 使用DI的好处?
1.6 常见的IOC框架。
微软自带DI、Autofac、Unity
二、.NET Core自身DI使用
2.1.NET Core自身DI
ASP.NET Core本身已经集成了一个轻量级的IOC容器,开发者只需要定义好接口后,在Startup.cs的ConfigureServices方法里使用对应生命周期的绑定方法即可,常见方法如下
在start.up类中ConfigureServices方法对实例进行注册
services.AddTransient<IApplicationService,ApplicationService>(); services.AddSingleton<IApplicationService,ApplicationService>(); services.AddScoped<IApplicationService,ApplicationService>();
这三个方法都是将我们实例注册进去,只不过是生命周期不一样。
AddSingleton:整个应用程序生命周期以内只创建一个实例,相当于一个静态类。
AddScoped:在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)。
AddTransient:每一次都会创建一个新的实例。
2.2 Demo应用
4)运行,查看结果
三、 采用Autofac替换IOC容器
Autofac是一款轻量级的IOC框架,目前和ASP.NET Core结合的非常好,官方网站http://autofac.org,源码下载地址https://github.com/autofac/Autofac。
1)在Nuget中引入两个:Autofac.Extras.DynamicProxy(Autofac的动态代理,它依赖Autofac,所以可以不用单独引入Autofac)、Autofac.Extensions.DependencyInjection(Autofac的扩展)
var builder = new ContainerBuilder();//实例化Autofac容器 builder.RegisterType<UserService>().As<IUserService>();//注册要通过反射创建的组件 builder.Populate(services); var ApplicationContainer = builder.Build(); return new AutofacServiceProvider(ApplicationContainer);//第三方IOC接管
3)同样也是通过构造函数进行注入
4)运行,查看结果
四、总结
本篇文章,主要是讲了IOC和DI的关系,以及通过微软自带的IOC框架和Autofac实现在ASP.NET Core中进行简单注入,其最大的优点就是实现了解耦的作用。同样,本篇文章也是为了记录自己学习的过程,后续有时间将会继续深入研究关于Autofac的内容。
好文参考:https://www.cnblogs.com/laozhang-is-phi/p/9541414.html(老张的哲学)