.NET core中IOC控制反转简单用法

说起IOC和DI,使用过ASP.NET Core的人对这两个概念一定不陌生,早前,自己也有尝试过去了解这两个东西,但是一直觉得有点很难去理解,总觉得对其还是模糊不清,所以,趁着今天有空,就去把两个概念捋清楚,并将学习过程的知识点记录下来。

1|0 一、IOC和DI的理解

1|11.1 什么是IOC?

Ioc—Inversion of Control,即控制反转,其是一种设计思想,而不是一种技术。再没有使用IOC之前,我们一般是通过new来实例化,从而创建一个对象。但是我们使用IOC之后,创建这个对象的控制权将由内部转换到外部,那么这个过程便可以理解为控制反转。

1|21.2 什么是DI(依赖注入)?

全称为Dependency Injection,意思自身对象中的内置对象是通过注入的方式进行创建。形象的说,即由容器动态的将某个依赖关系注入到组件之中。

1|31.3 IOC和DI的联系?

IOC是一种设计思想,而DI是这种设计思想的一个实现。理解IOC和DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”。
●谁依赖于谁:当然是应用程序依赖于IoC容器;
●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)

1|4 1.4 为啥需要反转?

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

1|51.5 使用DI的好处?

1)让程序之间松散耦合,减少依赖,有利于功能复用。
2)让程序整体结构更加灵活,有利于单元测试。

1|61.6 常见的IOC框架。

微软自带DI、Autofac、Unity

2|0二、.NET Core自身DI使用

2|12.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:每一次都会创建一个新的实例。

 

项目说明:

user:实体类

UserServer:实现接口

IUserServer:创建接口

ValuesController:控制器,请求的接扣

Startup.cs:配置文件,这里是需求添加 

services.Configure<CookiePolicyOptions>(Options =>
{
Options.CheckConsentNeeded = context => true;
Options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddTransient<IUserServer, UserServer>();

解释:ASP.NET Core本身已经集成了一个轻量级的IOC容器,开发者只需要定义好接口后,在Startup.cs的ConfigureServices方法里使用对应生命周期的绑定方法即可,常见方法如下

在start.up类中ConfigureServices方法对实例进行注册

 

 

 

 

 

 

 

 


__EOF__

本文作者ITMrRight Blog
本文链接https://www.cnblogs.com/yjm8023/p/11858696.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ITMrRight  阅读(598)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示