ASP.NET Core 中的 依赖注入介绍(asp.net mvc 依赖注入)
nanshan 2024-10-05 18:33 23 浏览 0 评论
ASP.NET Core 依赖注入
HomeController
public class HomeController : Controller { private IStudentRepository _studentRepository; //使用构造函数注入的方式注入IStudentRepository public HomeController(IStudentRepository studentRepository) { _studentRepository = studentRepository; } //返回学生的名字 public string Index() { return _studentRepository.GetStudent(1).Name; } }
注意事项 :
- HomeController依赖于IStudentRepository来 查询 Student 数据。
- 我们使用构造函数将IStudentRepository实例注入HomeController,而不是HomeController对IStudentRepository接口创建新的实例化。
- 这称为构造函数注入,因为我们使用构造函数来注入依赖项。
- 请注意,我们将注入的依赖项分配给只读字段readonly。这是一个很好的做法,因为它可以防止在方法中误操作地为其分配另一个值,比如 null。
- 此时,如果我们运行项目,则会收到以下错误:
InvalidOperationException: Unable to resolve service for type 'StudentManagement.Model.IStudentRepository' while attempting to activate 'StudentManagement.Controllers.HomeController'.
- 这是因为如果有人请求实现IStudentRepository的对象,ASP .NET Core 依赖注入容器不知道要提供哪个对象实例
- IStudentRepository可能有多个实现。在我们的项目中,我们只有一个实现,那就是MockStudentRepository
- 顾名思义,MockStudentRepository使用内存中的学生模拟数据。
- 在我们即将发布的视频中,我们将讨论为IStudentRepository提供另一个实现,该实现从 SQL Server 数据库中查询学生数据。
- 现在,让我们使用MockStudentRepository。
- 要修复 InvalidOperationException 错误,我们需要在 ASP.NET Core 中使用依赖注入容器注册MockStudentRepository类。
- 我们在 Startup 类的 ConfigureServices()方法中执行此操作
使用 ASP.NET Core 依赖注入容器注册服务:
ASP.NET Core 提供以下 3 种方法来使用依赖项注入容器注册服务。我们使用的方法决定了注册服务的生命周期。
AddSingleton()
AddSingleton()方法创建一个Singleton服务。首次请求时会创建Singleton服务。然后,所有后续请求都使用相同的实例。因此,通常,每个应用程序只创建一次Singleton服务,并且在整个应用程序生命周期中使用该单个实例。
AddTransient()
AddTransient() 方法可以称作:暂时性模式,会创建一个 Transient 服务。每次请求时,都会创建一个新的 Transient 服务实例。
AddScoped()
AddScoped()方法创建一个 Scoped 服务。在范围内的每个请求中创建一个新的 Scoped 服务实例。例如,在 Web 应用程序中,它为每个 http 请求创建 1 个实例,但在同一 Web 请求中的其他调用中使用相同的实例,在一个客户端请求中是相同的,但在多个客户端请求中是不同的。
请不要担心,如果这一点有点令人困惑。我们将在本系列即将发布的视频中好好单独讲这三种方法。
现在,要修复 InvalidOperationException 错误,让我们使用AddSingleton()向 ASP.NET Core 依赖注入容器注册MockStudentRepository类方法如下图所示。
所以在此代码中,如果有人调用IStudentRepository,将调用MockStudentRepository的实例服务。
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddSingleton<IStudentRepository, MockStudentRepository>(); }
在这一点上,您可能在想,为什么我们必须做这一切。为什么我们不能使用 new 关键字在 HomeController 中简单地创建MockStudentRepository类的实例,如下所示。
public class HomeController : Controller { private readonly IStudentRepository _studentRepository; //使用构造函数注入的方式注入IStudentRepository public HomeController(IStudentRepository studentRepository) { _studentRepository = new MockStudentRepository(); } //返回学生的名字 public string Index() { return _studentRepository.GetStudent(1).Name; } }
这使HomeController与MockStudentRepository紧密耦合。 稍后如果我们为IStudentRepository 提供新的实现,并且如果我们想要使用新的实现而不是MockStudentRepository,我们必须更改 HomeController 中的代码。您可能会想,这只是一行代码更改,所以这并不难。
那么,如果我们在我们的应用程序中的 50 个其他控制器中使用了这个MockStudentRepository呢? 所有 50 个控制器中的代码都必须更改。这不仅无聊而且容易出错。
简而言之,使用 new 关键字创建依赖关系的实例会产生紧密耦合,因此您的应用程序将很难更改。通过依赖注入,我们不会有这种紧密耦合。
使用依赖注入,即使我们在我们的应用程序中的 50 个其他控制器中使用了MockStudentRepository,如果我们想用不同的实现交换它,我们只需要在 Startup.cs 文件中更改以下一行代码。请注意,我们现在使用DatabaseStudentRepository而不是MockStudentRepository。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<IStudentRepository, DatabaseStudentRepository>();
}
这样带来的效果是单元测试也变得更加容易,因为我们可以通过依赖注入轻松地交换依赖项。 如果这有点令人困惑,请不要担心。我们将在即将发布的视频中为IStudentRepository提供不同的实现。此新实现将从 SQL Server 数据库中查询数据。然后,我们将使用DatabaseStudentRepository实现替换MockStudentRepository实现。那个时候,您将了解依赖注入提供的功能和灵活性。
欢迎添加个人微信号:Like若所思。
欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!
相关推荐
- 0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)
-
文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...
- ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes
-
为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...
- 生产环境starrocks 3.1存算一体集群部署
-
集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...
- 在CentOS上添加swap虚拟内存并设置优先级
-
现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...
- 国产深度(deepin)操作系统优化指南
-
1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...
- postgresql-15.4 多节点主从(读写分离)
-
1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...
- Docker 容器 Java 服务内存与 GC 优化实施方案
-
一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...
- 虚拟内存设置、解决linux内存不够问题
-
虚拟内存设置(解决linux内存不够情况)背景介绍 Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...
- Elasticsearch性能调优(5):服务器配置选择
-
在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...
- Es如何落地
-
一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...
- 针对Linux内存管理知识学习总结
-
现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...
- MySQL进阶之性能优化
-
概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...
- Linux Cgroups(Control Groups)原理
-
LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...
- linux 常用性能优化参数及理解
-
1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...
- 如何在 Linux 中使用 Sysctl 命令?
-
sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...
你 发表评论:
欢迎- 一周热门
-
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
手机如何设置与显示准确时间的详细指南
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
一加手机与电脑互传文件的便捷方法FileDash
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)