杨中科 ASP.NET DI综合案例
综合案例1
需求说明
1、目的:演示DI的能力;
2、有配置服务、日志服务,然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置,可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。
3、说明:案例中开发了自己的日志、配置等接口,这只是在揭示原理,.NET有现成的,后面讲。
实现1
1、创建三个.NETCore类库项目,ConfigServices是配置服务的项目,LogServices是日志服务的项目,Mailservices是邮件发送器的项目,然后再建一个.NETCore控制台项目MailServicesConsole来调用MailServices。MailServices项目引用ConfigServices项目和LogServices项目,而MailServicesConsole项目引用MailServices项目。
2、编写类库项目LogServices,创建ILogProvider接口。编写实现类ConsoleLogProvider。编写一个ConsoleLogProviderExtensions定义扩展方法AddConsoleLog,namespace和IServiceCollection一致
实现2
1、编写配置服务的类库项目ConfigServices。接口IConfigProvider,方法:stringGetValue(string name).2、环境变量读取配置类EnvVarConfigProvider:Environment.GetEnvironmentVariable(name);编写一个类带扩展方法:AddEnvVarConfig3、编写从ini文件中读取配置的类ConfigServices。
新建控制台项目

新建类库项目

日志服务
logServices 接口

实现类

配置服务

添加实现类

邮件服务
需要添加日志引用

控制台项目添加 邮件服务得引用

添加IMailServices 接口

Nuget 导入包 ,引入命名空间

控制台测试

运行结果:

综合案例2
新建配置实现类:

新建配置文件



编写实现类 代码(读取ini 文件)

主类:

运行结果:

方式二 更简单的方法
希望提供一个add 方法

使用扩展方法
添加一个扩展方法

使用:

运行结果:

改写ini配置文件读取:

调用

运行结果:

综合案例3
实现3
1、“可覆盖的配置读取器”。配置中心服务器。可以本地的覆盖配置服务器的,或者配置文件覆盖环境变量的。例如,按照“配置中心服务器”、“本地环境变量”、“本地配置文件”的顺序添加了三个配置提供者,在“配置中心服务器”中提供了“a=1;b=2;c=3”这三个配置项,在“本地环境变量”中配置了“a=10;b=20;”,在“本地配置文件”中配置了“b=200”,那么最终我们读取的时候读到的就是’a=10;b=200;c=3;’
2、定义一个从各个ConfigProvider中读取项的IConfigReader接口。编写实现类LayeredconfigReader。
示例:

实现类:


扩展方法:

更改MailService

调用

运行结果:

添加环境变量

运行结果:

改变后运行

运行结果

总结
关注于接口,而不是关注于实现,各个服务可以更弱耦合的协同工作。在编写代码的时候,我们甚至都不知道具体的服务是什么。
第三方DI容器:Autofac等。Autofac优点:支持属性注入基于名字注入、基于约定的注入等。
相关文章:
杨中科 ASP.NET DI综合案例
综合案例1 需求说明 1、目的:演示DI的能力; 2、有配置服务、日志服务,然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置,可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。 3、说明…...
蓝桥杯嵌入式第12届真题(完成) STM32G431
蓝桥杯嵌入式第12届真题(完成) STM32G431 题目 程序 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body**************************…...
C#系列-多线程(4)
在C#中,多线程编程主要涉及使用System.Threading命名空间下的类和接口来创建和管理线程。以下是一些C#多线程编程的基本用法和示例: 1. 使用Thread类创建线程 csharp代码 using System; using System.Threading; class Program { static void …...
VS如何调试C运行时库
C运行时库(简称crt)是C标准库等组件的基础, 其会在进入main函数之前运行一些代码, 包括但不限于初始化堆栈, 内存分配等操作 这些代码是可以随着VC工具集一起安装到我们本地的。看一下这个情况, 就是VS调试器没找到对应的crt源码的情况, 调用堆栈是空的。为了解决这个问…...
软件工程师,超过35岁怎么办
概述 随着科技行业的飞速发展,软件开发工程师的职业道路充满了各种机遇和挑战。对于已经在这个行业摸爬滚打了十多年的软件开发工程师来说,当他们步入35岁这个年纪时,可能会感到一些迷茫和焦虑。许多人担忧,在以创新、活力、快速迭…...
通过 Prometheus 编写 TiDB 巡检脚本(脚本已开源,内附链接)
作者丨 caiyfc 来自神州数码钛合金战队 神州数码钛合金战队是一支致力于为企业提供分布式数据库 TiDB 整体解决方案的专业技术团队。团队成员拥有丰富的数据库从业背景,全部拥有 TiDB 高级资格证书,并活跃于 TiDB 开源社区,是官方认证合作伙…...
sql语句学习(一)--查询
【有道云笔记】基本sql语句2—查询基础 数据库表结构 DROP TABLE IF EXISTS class; CREATE TABLE class (id int(11) NOT NULL AUTO_INCREMENT,class_num varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 班级号,class_name varchar(255) CHARACTE…...
【HTML】交友软件上照片的遮罩是如何做的
笑谈 我不知道大家有没有在夜深人静的时候感受到孤苦难耐,🐶。于是就去下了一些交友软件来排遣寂寞。可惜的是,有些交友软件真不够意思,连一些漂亮小姐姐的图片都要进行遮罩,完全不考虑兄弟们的感受,😠。所…...
【Java EE初阶十二】网络编程TCP/IP协议(一)
1. 网络编程 通过网络,让两个主机之间能够进行通信->就这样的通信来完成一定的功能,进行网络编程的时候,需要操作系统给咱们提供一组API,通过这些API来完成编程;API可以认为是应用层和传输层之间交互的路径…...
element-ui解决上传文件时需要携带请求数据的问题
一、问题描述 在前端使用element-ui进行文件上传时,需要携带请求头信息,比如Token。 二、问题解决 1. 表单实现 action置空添加:http-request属性覆盖默认的上传行为,实现自定义上传文件。注意:src后的图片路径如果是个网络请求(外链)&…...
【AI视野·今日NLP 自然语言处理论文速览 第七十九期】Thu, 18 Jan 2024
AI视野今日CS.NLP 自然语言处理论文速览 Thu, 18 Jan 2024 Totally 35 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deciphering Textual Authenticity: A Generalized Strategy through the Lens of Large Language Semantics …...
Docker容器运行
1、通过--name参数显示地为容器命名,例如:docker run --name “my_http_server” -d httpd 2、容器重命名可以使用docker rename。 3、两种进入容器的方法: 3.1、Docker attach 例如: 每间隔一秒打印”Hello World”。 Sudo docker run…...
【计算机网络】网络层之IP协议
文章目录 1.基本概念2.协议头格式3.网段划分4.特殊的IP地址5.IP地址的数量限制6.私有IP地址和公网IP地址7.路由 1.基本概念 IP地址是定位主机的,具有一个将数据报从A主机跨网络可靠的送到B主机的能力。 但是有能力就一定能做到吗,只能说有很大的概率。…...
2024/2/17 图论 最短路入门 dijkstra 1
目录 算法思路 Dijkstra求最短路 AcWing 849. Dijkstra求最短路 I - AcWing 850. Dijkstra求最短路 II - AcWing题库 最短路 最短路 - HDU 2544 - Virtual Judge (vjudge.net) 【模板】单源最短路径(弱化版) P3371 【模板】单源最短路径…...
交通管理|交通管理在线服务系统|基于Springboot的交通管理系统设计与实现(源码+数据库+文档)
交通管理在线服务系统目录 目录 基于Springboot的交通管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、驾驶证业务管理 3、机动车业务管理 4、机动车业务类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计…...
最适合初学者的Python入门详细攻略,一文讲清,赶紧收藏!
前言 目前python可以说是一门非常火爆的编程语言,应用范围也非常的广泛,工资也挺高,未来发展也极好。 Python究竟应该怎么学呢,我自己最初也是从零基础开始学习Python的,给大家分享Python的学习思路和方法。一味的买…...
幻兽帕鲁新手游戏攻略分享
在幻兽帕鲁中,提高实力是玩家不断追求的目标。以下是一些提高实力的攻略: 1、升级和进化:通过战斗和完成任务,玩家可以获得经验值,提升自己的等级。随着等级的提升,玩家可以获得技能点,用于提升…...
代码随想录算法训练营DAY19 | 二叉树 (6)
一、LeetCode 654 最大二叉树 题目链接:654.最大二叉树https://leetcode.cn/problems/maximum-binary-tree/ 思路:坚持左开右闭原则,递归划分数组元素生成左右子树。 class Solution {public TreeNode constructMaximumBinaryTree(int[] num…...
【C++】实现Date类的各种运算符重载
上一篇文章只实现了operator操作符重载,由于运算符较多,该篇文章单独实现剩余所有的运算符重载。继续以Date类为例,实现运算符重载: 1.Date.h #pragma once#include <iostream> #include <assert.h>using namespace …...
【Linux】程序地址空间 -- 详解 Linux 2.6 内核进程调度队列 -- 了解
一、程序地址空间回顾 在学习 C/C 时,我们知道内存会被分为几个区域:栈区、堆区、全局/静态区、代码区、字符常量区等。但这仅仅是在语言层面上的理解,是远远不够的。 如下空间布局图,请问这是物理内存吗? 不是&…...
拒绝封闭技术栈绑架:MyEMS 开源能源管理平台的架构中立性与兼容性设计
在企业数字化转型的深水区,能源管理系统正从单一的计量工具演变为支撑生产运营的核心基础设施。然而,当我们审视这一领域的技术现状时,不难发现一个令人警惕的现象:大量商业能源管理软件正通过封闭的技术栈、私有的通信协议和紧耦…...
一文读懂现代城市照明:从亮化到数字化的行业升级指南
当前照明行业早已脱离单纯"亮起来"的初级阶段,正在向场景化、数字化、低碳化方向快速迭代,很多客户在选择照明服务商时往往对行业标准、技术趋势了解不足,导致项目效果与预期存在差距。行业升级的核心方向:从单一照明到…...
零碳园区绿电直供技术的挑战与解决方案
一、难点问题 二次系统+储能推高初投 篇幅有限仅展示了部分 根据650号文 ,绿电直连项目必须配置继电保护、安全稳定控制装置和通信设备等二次系统 ,以确保项目的安全性和稳定性。这些强制性配置显著增加了项目的初始投资成本。 专线造价与全周…...
告别抓包烦恼:用Mitmproxy + Python脚本自动解密App接口数据(保姆级实战)
移动端App接口数据解密实战:Mitmproxy与Python自动化逆向分析 在移动应用安全测试和逆向工程领域,App与服务器之间的加密通信一直是分析人员的重点攻克对象。当面对一个网络请求被深度加密的App时,传统抓包工具往往只能展示一堆"乱码&qu…...
Arm Ethos-U65 NPU性能监控单元(PMU)架构与应用解析
1. Arm Ethos-U65 NPU性能监控单元架构解析 性能监控单元(PMU)是现代处理器架构中不可或缺的调试与分析模块,尤其在AI加速器领域更是性能调优的关键工具。Arm Ethos-U65 NPU作为面向嵌入式设备的神经网络处理器,其PMU设计充分考虑…...
RK3588开发板16GB LPDDR5与64GB eMMC性能解析与实战指南
1. 项目概述:当旗舰开发板遇上LPDDR5与超大存储最近在嵌入式圈子里,关于瑞芯微RK3588这颗“性能猛兽”的讨论热度一直没降下来。作为目前国产SoC里妥妥的旗舰,它集成的四核A76四核A55的CPU架构、高达6Tops算力的NPU,以及丰富的多媒…...
通过ip命令配置网络地址的方法
cat ../ip_cfg.sh # 为 end1 接口添加一个静态 IP 地址 (例如: 192.168.1.100/24) sudo ip addr add 196.12.0.100/24 dev end1# 激活 end1 接口 sudo ip link set end1 up# (可选)添加默认网关,例如 192.168.1.1 sudo ip route add default …...
【免费下载】 符合标准(GB、JB)的SolidWorks模板
符合标准(GB、JB)的SolidWorks模板 【下载地址】符合标准GBJB的SolidWorks模板 本仓库提供了一系列符合国家标准(GB)和机械行业标准(JB)的SolidWorks模板文件,适用于各种工程设计和绘图需求。这些模板涵盖了不同尺寸的…...
B站m4s转MP4终极指南:一键解决缓存视频兼容性问题
B站m4s转MP4终极指南:一键解决缓存视频兼容性问题 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的困扰&#…...
【Perplexity教育搜索实战指南】:3大隐藏功能+5个教师必用技巧,90%用户至今未发现
更多请点击: https://codechina.net 第一章:Perplexity教育信息搜索的核心价值与定位 Perplexity 作为新一代AI驱动的信息检索工具,其在教育场景中的核心价值在于将“被动查找”转化为“主动理解”。它不依赖传统关键词匹配,而是…...
