当前位置: 首页 > news >正文

ASP.NET Core MVC 项目 IOC容器

目录

一:什么是IOC容器

二:简单理解内置Ioc容器

三:依赖注入内置Ioc容器

四:生命周期

五:多种注册方式


一:什么是IOC容器

IOC容器是Inversion Of Control的缩写,翻译的意思就是控制反转。

DI依赖注入是Dependency Injection的缩写,翻译的意思就是依赖注入。

通过抽象【接口、抽象类、普通父类】获取具体的实例。

Ioc容器是创建对象并给对象中的属性赋值交由工厂管理,达到控制反转的目的。再通过DI依赖注入让工厂来管理对象的创建和属性的赋值。

Ioc容器的优点:实现组件之间的解耦,提高程序的灵活性、扩展性和可维护性。

DI依赖注入目前只支持构造函数注入,属性注入和方法注入请使用Autofac或其他第三方容器。

二:简单理解内置Ioc容器

using Microsoft.Extensions.DependencyInjection;
using System;namespace Study_ASP.NET_Core_MVC.ConsoleApp
{public static class Program{public static void Main(string[] args){//内置容器//1:Nuget引入Microsoft.Extensions.DependencyInjection.Abstractions//2:创建容器并初始化ServiceCollection serviceCollection = new ServiceCollection();//3:注册抽象和具体和普通类之间的关系serviceCollection.AddTransient<IPhone, ApplePhone>();//4:serviceCollection.Build一下ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();//5:获取对象的实例IPhone iPhone = serviceProvider.GetService<IPhone>();//6:内置容器调用方法iPhone.Call();iPhone.Text();Console.ReadLine();}}/// <summary>/// Interfaces层/// </summary>public interface IPhone{/// <summary>/// 打电话方法/// </summary>void Call();/// <summary>/// 发短信方法/// </summary>void Text();}/// <summary>/// Services层/// </summary>public class ApplePhone : IPhone{private IPhone? iPhone;public ApplePhone(IPhone? iPhone){this.iPhone = iPhone;}/// <summary>/// 打电话方法/// </summary>public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// <summary>/// 发短信方法/// </summary>public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}}
}

三:依赖注入内置Ioc容器

MicroPhone没有依赖。

HeadPhone依赖MicroPhone。

ApplePhone依赖HeadPhone。

IPhone关键代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.NET_Core_MVC.Interfaces
{public interface IPhone{IMicroPhone MicroPhone { get; set; }IHeadPhone HeadPhone { get; set; }/// <summary>/// 打电话方法/// </summary>void Call();/// <summary>/// 发短信方法/// </summary>void Text();/// <summary>/// 显示当前时间信息/// </summary>/// <param name="msgInfo">时间信息</param>/// <returns></returns>string ShowTime(string timeInfo);}public interface IMicroPhone { }public interface IHeadPhone { }
}

ApplePhone关键代码:

using Study_ASP.NET_Core_MVC.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.Net_Core_MVC.Services
{public class ApplePhone : IPhone{public IMicroPhone MicroPhone { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public IHeadPhone HeadPhone { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public ApplePhone(){Console.WriteLine("{0}无参构造函数", this.GetType().Name);}public ApplePhone(IHeadPhone headPhone){Console.WriteLine("{0}有参构造函数:{1}", this.GetType().Name,headPhone);}/// <summary>/// 打电话方法/// </summary>public void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// <summary>/// 发短信方法/// </summary>public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}/// <summary>/// 显示当前时间信息/// </summary>/// <param name="msgInfo">时间信息</param>/// <returns></returns>public string ShowTime(string timeInfo){Console.WriteLine("显示时间:{0}", timeInfo);return $"当前时间:{timeInfo}";}}
}

HeadPhone关键代码:

using Study_ASP.NET_Core_MVC.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.Net_Core_MVC.Services
{public class HeadPhone : IHeadPhone{private IMicroPhone microPhone;public HeadPhone(IMicroPhone iMicroPhone){Console.WriteLine($"{this.GetType().Name}被构造。。");this.microPhone = iMicroPhone;}}
}

MicroPhone关键代码:

using Study_ASP.NET_Core_MVC.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.Net_Core_MVC.Services
{public class MicroPhone : IMicroPhone{public MicroPhone(){Console.WriteLine($"{this.GetType().Name}被构造。。。");}}
}

Program关键代码:

//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。
//初始化当前应用程序的管道容器
using Microsoft.Extensions.DependencyInjection;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;var builder = WebApplication.CreateBuilder(args);
//向管道容器添加注册中间件
//添加注册控制器视图中间件
builder.Services.AddControllersWithViews();
//添加注册Session中间件
builder.Services.AddSession();
//配置管道容器中间件,构造WebApplication实例
//注册Ioc容器服务
builder.Services.AddTransient<IMicroPhone, MicroPhone>();
builder.Services.AddTransient<IHeadPhone, HeadPhone>();
builder.Services.AddTransient<IPhone, ApplePhone>();
var app = builder.Build();
//判断是否是开发模式
if (!app.Environment.IsDevelopment())
{//向管道中添加中间件,该中间件将捕获异常、记录异常、重置请求路径并重新执行请求。app.UseExceptionHandler("/Shared/Error");//向管道中添加用于使用HSTS的中间件,该中间件添加了Strict Transport Security标头。默认值为30天app.UseHsts();
}
//向管道添加Session中间件
app.UseSession();
//向管道添加用于将HTTP请求重定向到HTTPS的中间件。
app.UseHttpsRedirection();
//向管道添加为当前请求路径启用静态文件服务
app.UseStaticFiles();
//向管道添加路由配置中间件
app.UseRouting();
//向管道添加鉴权中间件
app.UseAuthentication();
//向管道添加授权中间件
app.UseAuthorization();
//向管道添加默认路由中间件
app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
//向管道添加启动应用程序中间件
app.Run();

控制器关键代码:

using Microsoft.AspNetCore.Mvc;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;
using System.Diagnostics;namespace Study_ASP.NET_Core_MVC.Controllers
{public class HomeController : Controller{/// <summary>/// 定义构造函数/// </summary>private readonly ILogger<HomeController> _logger;private readonly IPhone iPhone;private readonly IMicroPhone microPhone;private readonly IHeadPhone headPhone;/// <summary>/// 初始化构造函数/// </summary>/// <param name="logger"></param>public HomeController(ILogger<HomeController> logger, IPhone iPhone,IMicroPhone microPhone,IHeadPhone headPhone){_logger = logger;this.iPhone = iPhone;this.microPhone = microPhone;this.headPhone = headPhone;}/// <summary>/// Get请求/// Home控制器/// Index方法/// </summary>/// <returns></returns>[HttpGet]public IActionResult Index(){//调用打电话方法iPhone.Call();//调用发短信方法iPhone.Text();//电泳显示实践方法ViewBag.ShowTime =  iPhone.ShowTime(DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));return View();}}
}

视图代码:

@{ViewData["Title"] = "Home Page";
}<div class="text-center"><h1 class="display-4">Welcome</h1><h1 class="display-4">@ViewBag.ShowTime</h1><p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

结果:

四:生命周期

瞬时生命周期:Transient:AddTransient:在整个应用程序中,每次请求都会创建一个全新的实例。生命周期最短。

单例生命周期:Singleton:AddSingleton:在整个应用程序中,创建一个实例,后续请求都会使用该实例。生命周期最长。

作用域生命周期:Scoped:AddScoped:在整个应用程序中,同一个域内,创建一个实例,后续请求都会使用该实例。

五:多种注册方式

public static void Main(string[] args){//注册抽象和具体普通类{ServiceCollection serviceCollection = new ServiceCollection(); serviceCollection.AddTransient<IPhone, ApplePhone>();ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();IPhone iPhone = serviceProvider.GetService<IPhone>();//6:内置容器调用方法iPhone.Call();iPhone.Text();}//注册抽象和具体普通类{ServiceCollection serviceCollection = new ServiceCollection();serviceCollection.AddTransient(typeof(IPhone), typeof(ApplePhone));ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();IPhone iPhone = serviceProvider.GetService<IPhone>();//6:内置容器调用方法iPhone.Call();iPhone.Text();}//注册具体抽象类{ServiceCollection serviceCollection = new ServiceCollection();serviceCollection.AddTransient(typeof(ApplePhone));ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();ApplePhone applePhone = serviceProvider.GetService<ApplePhone>();//6:内置容器调用方法applePhone.Call();applePhone.Text();}//注册具体抽象类{ServiceCollection serviceCollection = new ServiceCollection();serviceCollection.AddTransient<ApplePhone>();ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();ApplePhone applePhone = serviceProvider.GetService<ApplePhone>();//6:内置容器调用方法applePhone.Call();applePhone.Text();}//注册抽象类和一段业务逻辑{ServiceCollection serviceCollection = new ServiceCollection();serviceCollection.AddTransient(typeof(IPhone), provider =>{//业务逻辑return provider;});serviceCollection.AddTransient(typeof(IPhone), typeof(ApplePhone));ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();IPhone iPhone = serviceProvider.GetService<IPhone>();//6:内置容器调用方法iPhone.Call();iPhone.Text();}Console.ReadLine();}

相关文章:

ASP.NET Core MVC 项目 IOC容器

目录 一&#xff1a;什么是IOC容器 二&#xff1a;简单理解内置Ioc容器 三&#xff1a;依赖注入内置Ioc容器 四&#xff1a;生命周期 五&#xff1a;多种注册方式 一&#xff1a;什么是IOC容器 IOC容器是Inversion Of Control的缩写&#xff0c;翻译的意思就是控制反转。 …...

ARM工控机/网关- 钡铼技术

一、NXP处理器ARM控制器的介绍 NXP半导体是汽车、穿戴、消费电子等领域中智能机器解决方案的领先供应商。其产品线庞大&#xff0c;包括处理器、微控制器、快速设计平台、ARM控制器等。在物联网控制、汽车电子、安全应用等领域&#xff0c;NXP处理器ARM控制器已成为半导体行业的…...

为什么都在喊数据可视化?它究竟怎么做?

在数字化转型的浪潮中&#xff0c;不论是传统行业&#xff0c;还是新兴行业总会提到“数据可视化”这个词。那数据可视化到底是什么&#xff1f;为什么会受到那么多人追捧&#xff1f;又该怎么才能做到数据可视化呢&#xff1f; 一、数据可视化是什么&#xff1f; 首先“可视…...

nodejs+vue停车场停车位短租系统vscode

目 录前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install产生) 这文件夹就是在创建完项目后&#xff0c;cd到项目目录执行npm install后生成的文件夹&#xff0c;下载了项目需要的依赖项。 2、…...

物理真机上LUKS结合TPM的测试 —— 使用随机数密钥

1. 创建磁盘空间 命令如下&#xff1a; dd if/dev/zero ofenc.disk bs1M count50 实际命令及结果如下&#xff1a; $ dd if/dev/zero ofenc.disk bs1M count50 输入了 500 块记录 输出了 500 块记录 52428800 字节 (52 MB, 50 MiB) 已复制&#xff0c;0.0587495 s&#xff…...

Linux USB 开发指南

文章目录Linux USB 开发指南1 前言1.1 文档简介1.2 目标读者1.3 适用范围2 模块介绍2.1 模块功能介绍2.2 相关术语介绍2.3 模块配置介绍2.3.1 Device Tree 配置说明2.3.2 board.dts 配置说明2.3.3 kernel menuconfig 配置说明2.4 源码结构介绍2.5 驱动框架介绍2.6 Gadget 配置2…...

FreeRTOS入门(03):队列、信号量、互斥量

文章目录目的队列&#xff08;queue&#xff09;信号量&#xff08;semaphore&#xff09;互斥量&#xff08;mutex&#xff09;互斥量递归互斥量总结目的 FreeRTOS提供给用户最核心的功能是任务&#xff08;Task&#xff09;&#xff0c;实际项目中通常会有多个任务&#xff…...

Biome-BGC在模拟过程中,如何使用Linux、Python等,完成前处理和后处理工作???

在Biome-BGC模型中&#xff0c;对于碳的生物量积累&#xff0c;采用光合酶促反应机理模型计算出每天的初级生产力(GPP)&#xff0c;将生长呼吸和维持呼吸减去后的产物分配给叶、枝条、干和根。生物体的碳每天都按一定比例以凋落方式进入凋落物碳库&#xff1b;对于水份输运过程…...

【unittest学习】unittest框架主要功能

1.认识unittest在 Python 中有诸多单元测试框架&#xff0c;如 doctest、unittest、pytest、nose 等&#xff0c;Python 2.1 及其以后的版本已经将 unittest 作为一个标准模块放入 Python 开发包中。2.认识单元测试不用单元测试框架能写单元测试吗&#xff1f;答案是肯定的。单…...

京东测开岗3+1面经+经验分享,拿到offer,月薪34k....

现在&#xff0c;招聘黄金时间已经来临&#xff0c;在网上看了很多大佬的面经&#xff0c;也加了很多交流群&#xff0c;受到了很多朋友的提点&#xff0c;今天终于轮到我来分享面经啦&#xff0c;之前面试了几家公司&#xff0c;最后拿到了京东测试岗的 offer&#xff0c;这里…...

后端接收格式为x-www-form-urlencoded的数据

1.x-www-form-urlencoded是什么&#xff1f; x-www-form-urlencoded纸面翻译即所谓url格式的编码&#xff0c;是post的默认Content-Type&#xff0c;其实就是一种编码格式&#xff0c;类似json也是一种编码传输格式。form表单中使用 form的enctype属性为编码方式&#xff0…...

LeetCode 707. 设计链表

LeetCode 707. 设计链表 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性&#xff1a;valvalval 和 nextnextnext。valvalval 是当前节点的值&#xff0c;nextnextnext 是指向下…...

HTTP的主要作用是什么

1、客户与服务器建立连接&#xff1b; 2、客户向服务器提出请求&#xff1b; 3、服务器接受请求&#xff0c;并根据请求返回相应的文件作为应答&#xff1b; 4、客户与服务器关闭连接。 HTTP的性质&#xff1a; 1、HTTP是一种无状态协议&#xff0c;即服务器不保留与客户交…...

SpringBoot系列-- @Enable 模块驱动

Enable 模块驱动 Enable 模块驱动是以 Enable 为前缀的注解驱动编程模型。所谓 “模块” 是指具备相同领域的功能组件集合&#xff0c;组合所形成一个独立的单元。比如 WebMVC 模块、AspectJ 代理模块、Caching &#xff08;缓存&#xff09;模块、JMX &#xff08;Java 管理扩…...

PHP程序员适合创业吗?

创业是一件自然而然的事&#xff0c;不需要人为选择。 只要你是一个努力能干主动的人&#xff0c;当你在一个行业深耕5年之后&#xff0c;就会发现人生发展的下一步就是创业。当然如果行业合适的话。 什么叫行业合适呢&#xff1f; 就是创业的成本并不那么高&#xff0c;不需…...

2023年CDGA考试-第12章-元数据(含答案)

2023年CDGA考试-第12章-元数据(含答案) 单选题 1.元数据架构的类型主要有四种下列哪项不属于分布式元数据架构的优点? A.减少了批处理 B.元数据的质量完全取决于源系统 C.最大程度的减少了实施和维护所需的工作量 D.元数据总是尽可能保持最新且有效 答案 B 2.元数据管理是…...

数据结构之顺序表篇

一、顺序表概念 二、顺序表各类接口实现 *顺序表初始化 **顺序表销毁 ***顺序表插入操作 ****顺序表删除操作 *****顺序表查找操作 ******顺序表实现打印操作 三、顺序表整体实现源码 *SeqList.h **SeqList.c ***test.c 一、顺序表概念 讲顺序表之前先引入线性表概念&#xff…...

ZBC通证月内已翻倍,Nautilus Chain 上线前夕的“开门红”

近日&#xff0c;Zebec Protocol生态通证ZBC迎来了大涨&#xff0c;据悉该通证月内最高涨幅接近了100%&#xff0c;为一众投资者、社区用户、Zepoch节点等带来了可观的回报&#xff0c;并为生态发展注入了十足的信心。我们看到&#xff0c;Zebec Protocol生态在近期宣布了“销毁…...

人工智能练习题:激活函数需要满足的条件、提高CNN的泛化能力、CNN输出特征图大小计算

文章目录1.激活函数需要满足的条件2.提高CNN泛化能力的方法3.CNN输出特征图大小计算第一次用ChatGPT&#xff0c;不得不说在处理大学生作业上&#xff0c;ChatGPT比国内的作业软件好用多了&#xff08;感叹&#xff09;。 1.激活函数需要满足的条件 通常情况下&#xff0c;激活…...

KingbaseES Json 系列三:Json数据操作函数一

KingbaseES Json 系列三--Json数据操作函数一(JSONB_EACH,JSONB_EACH_TEXT,JSONB_OBJECT_KEYS,JSONB_EXTRACT_PATH,JSONB_EXTRACT_PATH_TEXT,JSON_EACH,JSON_EACH_TEXT,JSON_OBJECT_KEYS,JSON_EXTRACT_PATH,JSON_EXTRACT_PATH_TEXT) JSON 数据类型是用来存储 JSON(JavaScript O…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...

零基础在实践中学习网络安全-皮卡丘靶场(第十一期-目录遍历模块)

经过前面几期的内容我们学习了很多网络安全的知识&#xff0c;而这期内容就涉及到了前面的第六期-RCE模块&#xff0c;第七期-File inclusion模块&#xff0c;第八期-Unsafe Filedownload模块。 什么是"遍历"呢&#xff1a;对学过一些开发语言的朋友来说应该知道&…...

中国政务数据安全建设细化及市场需求分析

(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…...

dvwa11——XSS(Reflected)

LOW 分析源码&#xff1a;无过滤 和上一关一样&#xff0c;这一关在输入框内输入&#xff0c;成功回显 <script>alert(relee);</script> MEDIUM 分析源码&#xff0c;是把<script>替换成了空格&#xff0c;但没有禁用大写 改大写即可&#xff0c;注意函数…...