c# DI构造函数注入

构造函数注入Constructor Injection)是依赖注入DI)的一种形式,是指通过类的构造函数将依赖项(通常是其他类或接口的实例)传递给类的实例。

这种方式可以让类在实例化时就具备所需的依赖项,使得这些依赖项对于类的实现来说是透明的,从而使得类更易于测试和维护。

示例

using System;
using Microsoft.Extensions.DependencyInjection;namespace DI会传染
{internal class Program{static void Main(string[] args){ServiceCollection services = new ServiceCollection();services.AddScoped<Controller>();services.AddScoped<ILog,LogImpl>();services.AddScoped<IStorage, StorageImpl>();//services.AddScoped<IConfig, ConfigImpl>();services.AddScoped<IConfig, DBConfigImpl>();using (var sp = services.BuildServiceProvider()){var c=sp.GetRequiredService<Controller>();c.Test();}}}class Controller{private readonly ILog log;private readonly IStorage storage;public Controller(ILog log, IStorage storage){this.log = log;this.storage = storage;}public void Test(){log.Log("开始上传");storage.Save("aasdfsdfasf", "1.txt");log.Log("上传完毕");}}interface ILog{void Log(string msg);}class LogImpl : ILog{public void Log(string msg){Console.WriteLine($"日志: {msg}");}}interface IConfig{public string GetValue(string name);}class ConfigImpl : IConfig{public string GetValue(string name){return "hello";}}class DBConfigImpl : IConfig{public string GetValue(string name){Console.WriteLine("从数据库读的配置");return "hello db";}}interface IStorage{public void Save(string content, string name);}class StorageImpl : IStorage{private readonly IConfig config;public StorageImpl(IConfig config){this.config = config;}public void Save(string content, string name){string server = config.GetValue("server");Console.WriteLine($"向服务器{server}的文件名为{name}上传{content}");}}
}

构造函数注入相对于正常创建对象方式的一些优势:

  1. 解耦性:
  • 构造函数注入可以帮助实现依赖倒置原则,从而减少类与其依赖之间的耦合度。
  • 类的实例化过程将依赖项注入进来,不需要类自己负责实例化依赖项,使得类更加独立和可复用。
  1. 可测试性:
  • 使用构造函数注入,可以轻松地传入模拟对象或桩(stub)来进行单元测试,而不需要依赖于外部资源或具体实现。
  • 这样可以更方便地编写单元测试,提高代码的质量和稳定性。
  1. 灵活性:
  • 通过构造函数注入,可以在类的实例化时动态传入不同的依赖项,而不需要修改类的代码。
  • 这样可以实现更好的灵活性和可扩展性,方便应对未来需求的变化。
  1. 代码可读性:
  • 构造函数明确地声明了类依赖的内容,使得代码更加清晰、易于理解。
  • 开发人员可以直观地看到类依赖的实例是如何被传入的,提高了代码的可读性和可维护性。
  1. 依赖注入框架支持:
  • 许多依赖注入框架(如.NET Core中的内置依赖注入容器)支持构造函数注入,可以自动解析和注入依赖项。
  • 这简化了依赖注入的配置和管理,减少了手动编写依赖注入代码的工作量。

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

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

相关文章

Linux——多路复用之select

目录 前言 一、select的认识 二、select的接口 三、select的使用 四、select的优缺点 前言 在前面&#xff0c;我们学习了五种IO模型&#xff0c;对IO有了基本的认识&#xff0c;知道了select效率很高&#xff0c;可以等待多个文件描述符&#xff0c;那他是如何等待的呢&a…

Dubbo 的泛化调用

在分布式系统中&#xff0c;有时我们需要调用一些未知的服务接口&#xff0c;这些接口可能在编译时并不存在&#xff0c;或者由于版本问题而发生变化。为了应对这种情况&#xff0c;Apache Dubbo 提供了泛化调用&#xff08;Generic Invocation&#xff09;功能&#xff0c;使得…

易保全参与起草的两项区块链全国团体标准正式发布

在数字化转型浪潮席卷全球的今天&#xff0c;区块链技术以其去中心化、透明性、不可篡改等独特优势&#xff0c;正逐步成为重塑各行各业信任机制与业务流程的关键力量。 近日&#xff0c;中国通信工业协会正式发布了《区块链服务 基于区块链的去中心化标识符技术要求》与《区块…

python--实验14 并发编程(多线程)

知识点 1 并发编程 1.1程序提速手段 1.2多任务 并发 在一个CPU一段时间内交替去执行任务。在各个任务之间快速地切换&#xff0c;给人的感觉就是多个任务在“同时进行”。 并行 对于多核CPU处理多任务&#xff0c;操作系统会给CPU的每个内核安排一个执行的软件&#xff0c;多…

[论文笔记] CT数据配比方法论——1、Motivation

我正在写这方面的论文,感兴趣的可以和我一起讨论!!!!!! Motivation 1、探测原有模型的配比: 配比 与 ppl, loss, bpw, benchmark等指标 之间的关系。 2、效果稳定的配比:配比 与 模型效果 之间的规律。 Experiments 1、主语言(什么语言作为主语言,几种主语言?…

【笔记-软考】软件架构风格

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-18 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 概念 架构风格是描述某一特定应用领域中系统组织方式的惯用模式&#xff0c;其反映了领域中众多系统所共有的结构和语义特性&#x…

web前端 Vue 框架面试120题(五)

面试题 81 . 请简述Vue更新数组时触发视图更新的方法&#xff1f; 参考回答&#xff1a; push()&#xff1b;pop()&#xff1b;shift()&#xff1b;unshift()&#xff1b;splice()&#xff1b;sort()&#xff1b;reverse()面试题 82 . 简述如何使用Vue-router实现懒加载的方式…

Vue 给表格单元格加省略号和hover提示

基于antd vue的a-popover封装一下即可 <template><a-popoverv-model"visible"trigger"none"><template #content>{{ text }}</template><divclass"ellipsis"mouseenter"onMouseenter"mouseleave"onM…

鸿蒙Navigation路由能力汇总

基本使用步骤&#xff1a; 1、新增配置文件router_map&#xff1a; 2、在moudle.json5中添加刚才新增的router_map配置&#xff1a; 3、使用方法&#xff1a; 属性汇总&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-compone…

Java线程池ThreadPoolExecutor原理、源码分析

目录 为什么要使用线程池&#xff1f; 线程池执行任务的具体流程是怎样的&#xff1f; 线程池的五种状态是如何流转的&#xff1f; 线程池中的线程是如何关闭的&#xff1f; 线程池为什么一定得是阻塞队列&#xff1f; 线程发生异常&#xff0c;会被移出线程池吗&#xff…

Python爬虫实战 | 爬取携程网景区评论|美食推荐|景点列表数据

本文采用Selenium库爬取携程网的景区评论。 携程接口接入 Selenium介绍 Selenium是一个Web的自动化测试工具&#xff0c;可以按指定的命令自动操作&#xff0c;如让浏览器加载页面、获取数据、页面截屏等。Selenium本身不自带浏览器&#xff0c;需要与第三方浏览器结合才能使…

sklearn基础教程:从入门到精通

文章目录 sklearn基础教程&#xff1a;从入门到精通一、sklearn简介二、安装与配置三、数据预处理数据导入数据清洗特征选择数据标准化与归一化 四、常用模型介绍与应用线性回归逻辑回归决策树支持向量机K近邻算法随机森林集成学习 五、模型评估与调优交叉验证网格搜索模型评估…

基于springboot和mybatis的RealWorld后端项目实战二之实现tag接口

修改pom.xml 新增tag数据表 SET FOREIGN_KEY_CHECKS0;-- ---------------------------- -- Table structure for tags -- ---------------------------- DROP TABLE IF EXISTS tags; CREATE TABLE tags (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,PR…

一文认识21世纪商贸物流新格局

在21世纪的全球化浪潮中&#xff0c;商贸物流作为连接生产与消费的重要纽带&#xff0c;其地位日益凸显。随着信息技术的飞速发展&#xff0c;特别是大数据、云计算、物联网等技术的广泛应用&#xff0c;现代物流已远远超越了传统意义上的货物运输与仓储&#xff0c;向着智能化…

前端Canvas入门——用canvas写五子棋?

前言 五子棋的实现其实不难&#xff0c;因为本身就是一个很小的游戏。 至于画线什么的&#xff0c;其实很简单&#xff0c;都是lineTo()&#xff0c;moveTo()就行了。 难的在于——怎么让棋子落入到指定的格子上&#xff0c;怎么判断连子胜利。 当然啦&#xff0c;这部分是…

基于STC8H4K64TL单片机的触摸功能调试

基于STC8H4K64TL单片机的触摸功能调试 STC8H4K64TL单片机介绍STC8H4K64TL单片机管脚图(48个引脚)STC8H4K64TL单片机串口仿真与串口通信STC8H4K64TL单片机管脚图(32个引脚)STC8H4K64TL单片机管脚图(20个引脚)STC8H系列单片机管脚说明STC8H系列单片机I/O口STC8H系列单片机I…

关于Codigger之软件项目体检Software Project HealthCheck

为你的软件项目提供快速、可靠的体检 项目体检是Codigger推出的智能代码质量检查工具&#xff0c;可以系统地帮助您交付干净的代码。作为我们Codigger解决方案的重要元素 &#xff0c;代码体检集成到您现有的工作流程中并检测代码中的问题&#xff0c;以帮助您对项目执行持续的…

django中日志模块logging的配置和使用

一、文件的配置 settings.py文件中添加LOGGING块的配置&#xff0c;配置如下 # 日志记录 LOGGING {"version": 1,"disable_existing_loggers": False, # 用于确定在应用新的日志配置时是否禁用之前配置的日志器# 格式器"formatters": {"v…

云监控(华为) | 实训学习day4(10)

SpringBoot增删改的细节研究 一、Spring boot增的安全性 1.开启数据库的事务 SpringBoot中Service层有事务&#xff08;保证操作成功&#xff09; 两个用户操作&#xff0c;同时增加同一条数据&#xff08;用户名&#xff0c;密码一致&#xff09; 验证内容&#xff0c;开启…

MySQL:基础操作(增删查改)

目录 一、库的操作 创建数据库 查看数据库 显示创建语句 修改数据库 删除数据库 备份和恢复 二、表的操作 创建表 查看表结构 修改表 删除表 三、表的增删查改 新增数据 插入否则更新 插入查询的结果 查找数据 为查询结果指定别名 结果去重 where 条件 结…