简述控制反转ioc_浅谈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是一种设计思想,而DI是这种设计思想的一个实现。理解IOC和DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”。

●谁依赖于谁:当然是应用程序依赖于IoC容器;
●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)

 1.4 为啥需要反转?

为了在业务变化的时候尽量减少改动代码造成的问题。

1.5 使用DI的好处?

1)让程序之间松散耦合,减少依赖,有利于功能复用。

2)让程序整体结构更加灵活,有利于单元测试。

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();
services.AddSingleton();
services.AddScoped();

这三个方法都是将我们实例注册进去,只不过是生命周期不一样。

AddSingleton:整个应用程序生命周期以内只创建一个实例,相当于一个静态类。

AddScoped:在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)。

AddTransient:每一次都会创建一个新的实例。

 2.2 Demo应用

1)首先定义好一个IUserService接口,然后实现该接口

1599705e6d25f86836a52beb33796066.png

3a31d7f136a9412c93536056ebc88b00.png

 2)在startup.cs类中ConfigureServices方法中添加下面代码

f4088c1670cedfa309dff42e746e912f.png

3)通过构造函数来注入

0e0af47e469c15ed56fa17159e221851.png

4)运行,查看结果

2e62144caee58ad5a97e6d12e0eceab1.png

 三、 采用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的扩展)

2)在startup.cs类中ConfigureServices方法中添加以下代码:(注意:把返回值类型改为IServiceProvider)

a5254dd42a41b8840fd085dcb363ac6a.png

var builder = new ContainerBuilder();//实例化Autofac容器
builder.RegisterType().As();//注册要通过反射创建的组件 builder.Populate(services);var ApplicationContainer = builder.Build();return new AutofacServiceProvider(ApplicationContainer);//第三方IOC接管

3)同样也是通过构造函数进行注入

0e0af47e469c15ed56fa17159e221851.png

4)运行,查看结果

2e62144caee58ad5a97e6d12e0eceab1.png

四、总结

本篇文章,主要是讲了IOC和DI的关系,以及通过微软自带的IOC框架和Autofac实现在ASP.NET Core中进行简单注入,其最大的优点就是实现了解耦的作用。同样,本篇文章也是为了记录自己学习的过程,后续有时间将会继续深入研究关于Autofac的内容。

好文参考:https://www.cnblogs.com/laozhang-is-phi/p/9541414.html(老张的哲学)

c3c5b05d6ed21c0da0987696a0299e6c.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程通过实际项目融入常用开发技术架构,讲授风格独特,提供详细上课日志及答疑,赠送配套的项目架构源码注释详细清晰且表达通俗,均能直接在实际项目应用,正真的物超所值,价格实惠任务作业:综合运用《C#/.Net企业级系统架构设计实战精讲教程》课程所学知识技能设计一个学生成绩管理系统的架构。要求:1.系统基于MVC的三层架构,各层单独建不同的解决方案文件夹。2.采用Model First开发方式,设计架构时只需要设计学生表(TbStudent)和课程表(TbCourse)。学生表必须有的字段是ID、stuName、age;课程表必须有的字段是ID、courseName、content。3.数据访问层采用Entity Framework或NHibernate来实现,必须封装对上述表的增删改查方法。4.必须依赖接口编程,也就是必须要有数据访问层的接口层、业务逻辑层的接口层等接口层。层层之间必须减少依赖,可以通过简单工厂或抽象工厂。5.至少采用简单工厂、抽象工厂、Spring.Net等技术的2种来减少层与层之间的依赖等。6.封装出DbSession类,让它拥有所有Dal层实例和SaveChanges方法。7.设计出数据访问层及业务逻辑层主要类的T4模板,以便实体增加时自动生成相应的类。8.表现层要设计相关的控制器和视图来验证设计的系统架构代码的正确性,必须含有验证增删改查的方法。9.开发平台一定要是Visual Studio平台,采用C#开发语言,数据库为SQL Server。10.提交整个系统架构的源文件及生成的数据库文件。(注意: 作业需写在CSDN博客,请把作业链接贴在评论区,老师会定期逐个批改~~)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值