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容器
目录 一:什么是IOC容器 二:简单理解内置Ioc容器 三:依赖注入内置Ioc容器 四:生命周期 五:多种注册方式 一:什么是IOC容器 IOC容器是Inversion Of Control的缩写,翻译的意思就是控制反转。 …...

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

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

nodejs+vue停车场停车位短租系统vscode
目 录前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install产生) 这文件夹就是在创建完项目后,cd到项目目录执行npm install后生成的文件夹,下载了项目需要的依赖项。 2、…...

物理真机上LUKS结合TPM的测试 —— 使用随机数密钥
1. 创建磁盘空间 命令如下: dd if/dev/zero ofenc.disk bs1M count50 实际命令及结果如下: $ dd if/dev/zero ofenc.disk bs1M count50 输入了 500 块记录 输出了 500 块记录 52428800 字节 (52 MB, 50 MiB) 已复制,0.0587495 sÿ…...

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):队列、信号量、互斥量
文章目录目的队列(queue)信号量(semaphore)互斥量(mutex)互斥量递归互斥量总结目的 FreeRTOS提供给用户最核心的功能是任务(Task),实际项目中通常会有多个任务ÿ…...

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

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

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

后端接收格式为x-www-form-urlencoded的数据
1.x-www-form-urlencoded是什么? x-www-form-urlencoded纸面翻译即所谓url格式的编码,是post的默认Content-Type,其实就是一种编码格式,类似json也是一种编码传输格式。form表单中使用 form的enctype属性为编码方式࿰…...

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

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

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

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

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

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

ZBC通证月内已翻倍,Nautilus Chain 上线前夕的“开门红”
近日,Zebec Protocol生态通证ZBC迎来了大涨,据悉该通证月内最高涨幅接近了100%,为一众投资者、社区用户、Zepoch节点等带来了可观的回报,并为生态发展注入了十足的信心。我们看到,Zebec Protocol生态在近期宣布了“销毁…...

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

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…...

《设计模式》单例模式
《设计模式》单例模式 单例模式是一种常用的设计模式,其主要优点有: 提供了对唯一实例的全局访问。单例模式保证了整个系统中只有一个实例,这样就可以方便地对该实例进行访问和操作,避免了多个实例之间的冲突和不一致。避免了重…...

C/C++每日一练(20230224)
目录 1. 字符串排序 2. Excel表列名称 3. 颠倒二进制位 附录: 位移运算符 左移运算符<< 1.无符号 2.有符号 右移运算符>> 1.无符号 2.有符号 程序测试 1. 字符串排序 编写程序,输入若干个字符串。 要求: (1&#x…...

基于YOLO的酸枣病虫害检测识别实践
在我前面的博文中对于农作物病虫害的检测识别已经做过了,不过那个主要是针对水稻的,文章如下:《基于yolov5的轻量级水稻虫害目标检测项目实践》感兴趣的话可以自行移步阅读。这里主要是针对酸枣常见的几种病虫害检测检测识别,首先…...

WAF:ModSecurity on Nginx(15)
预备知识 Nginx概述 Nginx ("engine x") 是一个高性能的HTTP和 反向代理 服务器,也是一个 IMAP/POP3/SMTP服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代…...

Qt 第3课、Qt 中的字符串类
1、C 标准库 STL STL 是意义上需要与C 一同发布的标准库STL 是一套以模板技术完成的 C类库STL 中包含了常用的算法和数据结构STL 包含了字符串类 2、Qt 和 STL STL 的具体实现依赖于编译器生产厂商STL 的 “标准” 只是其接口是标准的 — 相同的全局函数 — 相同的算法类和数…...

Vulnhub靶场----6、DC-6
文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-6下载地址:https://download.vulnhub.com/dc/DC-6.zip kali:192.168.144.148 DC-6:192.168.144.154 靶机描述:选择带k01的密码后面会用到 访问192.168.144.154&…...

华为OD机试真题Python实现【去重求和】真题+解题思路+代码(20222023)
去重求和 给定一个数组,编写一个函数, 计算他的最大N个数和最小N个数的和, 需要对数组进行去重。 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 输入 第一行输入M,M表示数组大小 第二行输入M个数,表示数组内容 第三行输入N表示需要…...

lammps教程:Ovito选择特定晶粒的方法
大家好,我是小马老师。 本文介绍如何使用ovito提取特定的晶粒。 在多晶的lammps模拟中,可能会对某一个特定晶粒的变形情况进行分析,此时,需要找到这个晶粒,并进行单独分析。 ovito有专用的晶粒识别命令,…...

DevEco Studio 3.1 Beta1版本发布——新增六大关键特性,开发更高效
智能代码编辑、端云一体化开发、低代码开发个性化…… 六大新增关键特性,开发更高效,体验更觉妙! 立即点击链接下载,做DevEco Studio 3.1 Beta1版本尝鲜者! 下载链接:HUAWEI DevEco Studio和SDK下载和升级 …...

【蓝桥杯每日一题】二分算法
🍎 博客主页:🌙披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 蓝桥杯 🌙我与杀戮之中绽放,亦如黎明的花…...