杨中科 ASP.NET DI综合案例

news/2024/5/19 23:24:22 标签: 数据库, .netcore, asp.net, 后端, c#

综合案例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优点:支持属性注入基于名字注入、基于约定的注入等。


http://www.niftyadmin.cn/n/5379689.html

相关文章

前端小案例——购买电影票(HTML+CSS+JS, 附源码)

一、前言 实现功能: 这段代码实现了一个简单的电影票选座购买的功能界面。 在页面上展示了一个电影院的座位布局,以及右侧显示了电影信息、选座情况、票价、总计等内容。 用户可以通过点击座位来选择购买电影票,每个座位的状态会在点击时改…

数据结构链表力扣例题AC(1)——代码以及思路记录(含链表本机调试tips)

链表力扣例题 876. 链表的中间结点 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 AC struct ListNode* middleNode(struct ListNode* head) {struct ListNode* slow head, *fast head;w…

【设计模式】观察者模式Observer Pattern

目录 遇到问题 梳理需求 观察者模式的实现 JDK中的实现 遇到问题 当一个对象发生修改时,需要通知多方。 很自然就会想到回调,这个就是观察者模式的核心,观察者模式可以将大量的回调解耦,从而使代码更加优雅。 梳理需求 意图…

LLMs模型选择,LLMs复读机问题,LLMs长文本处理方案

为什么会出现 LLMs 复读机问题? LLMs 复读机问题(LLMs Parroting Problem)是指大型语言模型(LLMs)在生成文本时可能出现的重复或重复先前输入内容的现象。出现LLMs复读机问题可能有以下几个原因: 数据偏差…

MySQL 插入10万条数据性能分析

MySQL 插入10万条数据性能分析 一、背景 笔者想复现一个索引失效的场景,故需要一定规模的数据作支撑,所以需要向数据库中插入大约一百万条数据。那问题就来了,我们应该怎样插入才能使插入的速度最快呢? 为了更加贴合实际&#…

ABC341 A-G

Toyota Programming Contest 2024#2(AtCoder Beginner Contest 341) - AtCoder B读不懂题卡了,F读假题卡了,开题开慢了rank了 A - Print 341 题意: 打印一串交替出现的包含N个0,N1个1的01串 代码&…

npm ERR! code CERT_HAS_EXPIRED:解决证书过期问题

转载:npm ERR! code CERT_HAS_EXPIRED:解决证书过期问题_npm err! code cert_has_expired npm err! errno cert-CSDN博客 npm config set registry http://registry.cnpmjs.org npm config set registry http://registry.npm.taobao.org

流程结构

章节目录: 一、选择结构1.1 if 语句1.2 if...else 语句1.3 嵌套 if1.4 if...else if...else1.5 三目运算符1.6 switch 语句 二、循环结构2.1 while 语句2.2 do...while 语句2.3 for 语句2.4 嵌套循环 三、跳转语句3.1 break 语句3.2 continue 语句3.3 goto 语句 四、…