【NET跨平台】3.初识内置的依赖注入容器

这里不会详细介绍控制反转和依赖注入的概念,只简单说明一下:依赖注入是控制反转思想的具体实现,使用容器创建和分配对象,并在运行时将对象传入类中。

1.注册服务的流程

现在请先创建一个NET5版本的webapi项目,然后按如下方式操作:
1.创建一个UserService.cs

public class UserService
{public int Add(string name){Console.WriteLine($"新增用户{name}成功");return 1;}
}

2.打开Startup.cs,在ConfigureServices方法内将UserService注册为瞬时服务

public void ConfigureServices(IServiceCollection services)
{services.AddTransient<UserService>();// ...
}

3.在控制器的构造函数添加以下代码

private readonly UserService _userService;
public UserController(UserService userService)
{_userService = userService;
}[HttpPost]
public IActionResult Add(string name)
{int id = _userService.Add(name);return Ok(id);
}

2.服务类型介绍

以上简单演示了注册服务的过程,并且提到了关键词瞬时服务。实际上NET的服务有3种:瞬时服务、作用域服务、单例服务。
Transient:瞬时服务。使用AddTransient方法注册。每次调用时都会实例化新的对象,也是最通用的服务。如果服务A和服务B都使用瞬时服务C,则容器会单独为服务A和服务B分配一个服务C的对象。
Scoped:作用域服务。使用AddScoped方法注册。在一次请求中保持该实例直到请求结束,这意味着作用域服务可在不同的服务之间来回流转并保持状态,就像HttpContext、DbContext那样。如果服务A和服务B都需要使用作用域服务C,则容器会为服务A分配一个服务C对象,并且保持该对象的状态以便于在服务B中使用。
Singleton:单例服务。使用AddSingleton方法注册。首次使用时创建对象,之后该实例一直存在。所有客户端所有请求都使用同一个对象。

服务类型同一个请求不同的请求
Transient新实例新实例
Scoped同一个实例新实例
Singleton同一个实例同一个实例

3.实际开发常见做法

1.使用接口与实现类的注册。

// 在Startup内注册
services.AddTransient<IMyService, MyService>();// 在其他服务内接收实例
private readonly IMyService _service;
public UserController(IMyService service)
{_service = service;
}

2.尝试注册服务,避免重复注册引发异常。常用于封装方法时使用,避免产生冲突。

// using Microsoft.Extensions.DependencyInjection.Extensions;
// 检查是否已经注册过该服务,若已经注册过则会自动忽略
services.TryAddTransient<MyService>();

3.注入泛型类型。

services.AddTransient(typeof(MyService<>));

以上就是NET5的依赖注入容器简单用法,只需要在Startup内注册服务,然后通过构造函数接收该服务的实例就可以直接使用。和传统做法相比,省去了使用new手动创建并管理实例的生命周期。下一篇会讲解依赖注入的注意事项。


如果内容对您有帮助,也可给笔者一点小小的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/485761.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

雷卯推荐多种SMB30J 3000W TVS

TVS的简介 瞬态电压抑制二极管&#xff0c;简称TVS。当TVS两极受到反向瞬态高能量冲击时&#xff0c;它能以 10- s的速度&#xff0c;将其两极间的高阻抗变为低阻抗&#xff0c;吸收高达数千瓦的浪涌功率&#xff0c;使两极间的电压钳位于一个预定值&#xff0c;有效地保护电子…

绝地求生:账号防盗小课堂

大家好阿&#xff0c;这次闲游盒又来了。 很早之前就想出一期关于steam预防被盗的小课堂&#xff0c;但一直苦于没有时间&#xff0c;那这次趁着过年在家有空就出一期吧。我会从多个方面告诉大家原理&#xff0c;以及如何防止账号被盗&#xff0c;疑问解答。搬上小板凳坐好开始…

MDST150-16-ASEMI三相可控整流模块MDST150-16

编辑&#xff1a;ll MDST150-16-ASEMI三相可控整流模块MDST150-16 型号&#xff1a;MDST150-16 品牌&#xff1a;ASEMI 正向电流&#xff08;Id&#xff09;&#xff1a;150A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1600V 正向浪涌电流&#xff1a;1200A 正…

【Vue】本地使用 axios 调用第三方接口并处理跨域

前端处理跨域 一. 开发准备 开发工具&#xff1a;VScode框架&#xff1a;Vue2项目结构&#xff1a;vue脚手架生成的标准项目&#xff08;以下仅显示主要部分&#xff09; 本地已搭建好的端口&#xff1a;8080要请求的第三方接口&#xff1a;http://1.11.1.111:端口号/xxx-api…

wondows10用Electron打包threejs的项目记录

背景 电脑是用的mac&#xff0c;安装了parallels desktop ,想用electron 想同时打包出 苹果版本和windows版本。因为是在虚拟机里安装&#xff0c;它常被我重装&#xff0c;所以记录一下打包的整个过程。另外就是node生态太活跃&#xff0c;几个依赖没记录具体版本&#xff0…

RENISHAW雷尼绍双读数头系统应用分享

在精密回转运动控制中&#xff0c;大多数场合都会对系统的回转定位精度有严格的要求&#xff0c;RENISHAW雷尼绍圆光栅系统&#xff08;RESM增量和RESA绝对值&#xff09;对于回转角度的反馈测量方案能有效的解决运动控制对回转精度的需求。但是配置单个读数头的圆光栅系统的精…

基于springboot+vue的桂林旅游景点导游平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【Linux】 logout命令使用

logout命令 Linux logout命令用于前登录的用户退出系统。 它会终止当前用户的会话并返回到登录界面或者重新登录。当使用logout命令时&#xff0c;系统会关闭所有与当前用户相关的进程和程序&#xff0c;并释放占用的资源。 使用logout命令可以方便地切换用户或者注销当前用…

Vue知识学习

Vue 是什么&#xff1f; 概念&#xff1a;Vue 是一个用于构建用户界面的渐进式框架 Vue 的两种使用方式: ① Vue 核心包开发 场景:局部 模块改造 ② Vue 核心包& Vue插件工程化开发 场景:整站开发 创建Vue 实例&#xff0c;初始化渲染的核心步骤: 1.准备容器 2.引包(官…

web基础及http协议 (二)----------Apache相关配置与优化

一、httpd 安装组成 http 服务基于 C/S 结构 1 .常见http 服务器程序 httpd apache&#xff0c;存在C10K&#xff08;10K connections&#xff09;问题 nginx 解决C10K问题lighttpd IIS .asp 应用程序服务器 tomcat .jsp 应用程序服务器 jetty 开源的servlet容器&#xf…

2个wordpress优化SEO主题模板

SEO优化wordpress主题 简洁的SEO优化wordpress主题&#xff0c;效果好不好&#xff0c;结果会告诉你&#xff0c;适合SEO公司使用的主题。 https://www.jianzhanpress.com/?p2804 SEO优化海外WordPress主题 简洁的SEO优化海外服务商WordPress主题&#xff0c;为中国制造202…

十八、图像像素类型转换和归一化操作

项目功能实现&#xff1a;对一张图像进行类型转换和归一化操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 norm.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class NORM { public:void norm(Mat& image); };#pragma once二…

【EI会议征稿通知】2024年软件自动化与程序分析国际学术会议(SAPA 2024)

2024年软件自动化与程序分析国际学术会议&#xff08;SAPA 2024) 2024 International Conference on Software Automation and Program Analysis 在当今科技社会中&#xff0c;软件产业呈快速发展趋势&#xff0c;软件自动化与程序分析技术在提高软件质量、降低开发成本、提升…

如何使用Express框架构建一个简单的Web应用

在这个数字化时代&#xff0c;Web应用的需求越来越多样化和复杂化。在前端开发领域&#xff0c;Express框架作为一个快速、灵活的Node.js Web应用程序框架&#xff0c;拥有强大的功能和丰富的生态系统&#xff0c;深受开发者们的青睐。本篇博客将带您一步步探索如何使用Express…

Spring之AOP源码解析(上)

Aop相关注解 EnableTransactionManagementEnableAspectJAutoProxyEnableAsync... 从注解切入来看看这些注解都干了什么 Import注解作用简述 注入的类一般继承ImportSelector或者ImportBeanDefinitionRegistrar接口 继承ImportSelector接口&#xff1a;selectImports方法返回…

通信入门系列——锁相环、平方环、Costas环

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、锁相环 1、压控振荡…

设计模式-创建型模式-原型模式

原型模式&#xff08;Prototype Pattern&#xff09;&#xff1a;使用原型实例指定创建对象的种类&#xff0c;并且通过克隆这些原型创建新的对象。原型模式是一种对象创建型模式。原型模式其实就是从一个对象再创建另外一个可定制的对象&#xff0c;而且不需知道任何创建的细节…

初识表及什么是数据表

一、了解表 1.1.概述 表是处理数据和建立关系型数据库及应用程序的基本单元&#xff0c;是构成数据库的基本元素之一&#xff0c;是数据库中数据组织并储存的单元&#xff0c;所有的数据都能以表格的形式组织&#xff0c;目的是可读性强。 1.2.表结构简述 一个表中包括行和列…

C# OpenCvSharp 利用白平衡技术进行图像修复

目录 效果 灰度世界(GrayworldWB)-白平衡算法 完美反射(SimpleWB)-白平衡算法 基于学习的(LearningBasedWB)-白平衡算法 代码 下载 C# OpenCvSharp 利用白平衡技术进行图像修复 OpenCV xphoto模块中提供了三种不同的白平衡算法&#xff0c;分别是&#xff1a;灰度世界(G…

qml 保存当前界面并在其图片中添加文字

使用场景&#xff1a;在保存二维码的时候&#xff0c; 在二维码图片加标题或描述 保存后的图片 demo&#xff1a;https://download.csdn.net/download/uVarAndMethod/88868455