杨中科 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优点:支持属性注入基于名字注入、基于约定的注入等。

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

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

相关文章

第三百四十九回

文章目录 1. 概念介绍2. 原理与方法2.1 知识对比2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"加密包crypto"相关的内容,本章回中将介绍characters包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 在项目中会遇到获取字…

Django实战:部署项目 【资产管理系统】,Django完整项目学习研究(项目全解析,部署教程,非常详细)

导言 关于Django,我已经和大家分享了一些知识,考虑到一些伙伴需要在实际的项目中去理解。所以我上传了一套Django的项目学习源码,已经和本文章进行了绑定。大家可以自行下载学习,考虑到一些伙伴是初学者,几年前&#…

OpenAI又出王炸,Sora是否要开启视频AI新时代?

OpenAI又出王炸,Sora是否要开启视频AI新时代? 关注微信公众号 DeepGoAI 前几天我们还在讨论 如何让ChatGPT3.5变得更聪明 今天OpenAI就带着新王炸出现了 如同ChatGPT一般 在计算机领域掀起轩然大波 开启真正视频AI新时代 那就是 Sora 很多同学可…

结构体对齐规则及为什么会有结构体对齐

前言: 大家在学习结构体中,在计算结构体大小时想必会很疑惑,为什么结构体的大小不是按照常理像数组一样一个字节一个字节的挨在一起放?今天带大家一起深入探讨一下背后的规则和原因。 结构体对齐规则: 结构体对齐其实…

离散数学截图2

为什么G中阶大于2的元素,一定有偶数个 在有限群G中,阶大于2的元素个数一定是偶数的原因如下: 设 aaa 是群G中一个阶大于2的元素,那么根据群的定义和阶的概念(即某个元素的幂次使得其等于单位元的最小正整数&#xff…

【Linux】 Linux 小项目—— 进度条

进度条 基础知识1 \r && \n2 行缓冲区3 函数介绍 进度条实现版本 1代码实现运行效果 版本2 Thanks♪(・ω・)ノ谢谢阅读!!!下一篇文章见!!! 基础知识 1 \r &&a…

linux 安装docker

目录 环境 操作步骤 1 下载脚本 2 执行脚本 3 检查docker版本,证明安装成功 环境 阿里云 ubuntu 22.04 64位 操作步骤 参考linux系统安装docker-腾讯云开发者社区-腾讯云 (tencent.com) 1 下载脚本 curl -fsSL https://get.docker.com -o get-docker.sh …

牛客小白月赛87

说明 年后第一次写题,已经麻了,这次的题很简单但居然只写了两道题。有种本该发挥80分的水平,但是只做出了20分的水平的感觉。不过剩下几个题(除了G题),比完赛一小时内就AC了。欢迎大家交流学习。&#xff0…

OpenCV 笔记(22):图像的缩放——最近邻插值、双线性插值算法

1. 图像缩放 1.1 简介 图像缩放是指通过增加或减少像素来改变图像尺寸的过程,是图像处理中常见的操作。图像缩放会涉及效率和图像质量之间的权衡。 图像放大(也称为上采样或插值)的主要目的是放大原图像,以便在更高分辨率的显示设…

RK3568笔记十五:触摸屏测试

若该文为原创文章,转载请注明原文出处。 使用正点原子的ATK-RK3568板子,一直在测试屏幕和视频,突然想到触摸屏测试,一直没有用过,原子给的demo跑的是QT系统,触摸功能是正常的,测试一下&#xf…

学习天机02

1.注入bean的写法 构造函数的注入 2.回答和评论 在做这个功能的时候需要理解一些概念,张三提出问题就是提问者,李四去回答张三的问题,李四就是回答者,王五去回答李四的评论,王五就是评论者。 在提供的InteractionRep…

MySQL免安装版安装教程

官网下载安装包 MySQL :: Download MySQL Community Server (Archived Versions) 选择mysql版本下载 安装配置MySQL 将下载完的Mysql安装包解压到指定目录 打开windos系统的cmd,以管理员身份运行 进入mysql文件夹中的bin目录 安装MySQL的服务mysqld --install 初…

幻兽帕鲁游戏联机的时候,显示“网络连接超时”怎么解决?

如果你在游戏联机的时候,显示“网络连接超时”,可以检查下: 1、前提是你已经按照教程部署成功 2、检查防火墙有没有忘记设置,协议是UDP(只有TCP不行,一定要有UDP),端口是否填了8211&…

AI:128-基于机器学习的建筑物能源消耗预测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

02 c++入门

目录 c关键字命名空间c输入&输出缺省参数函数重载引用内联函数auto关键字(c11)基于范围的for循环(c11)指针空值—nullptr(c11) 0. 本节知识点安排目的 c是在c的基础上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等…

【论文精读】DINO

摘要 基于对ViT在监督学习领域的表现质疑,探究自监督方法下的ViT是否具有更好的特征提取能力,进而发现: 自监督ViT特征包含场景布局、对象边界。这些信息可以在最后一自注意力模块中直接访问。自监督ViT特征结合最近邻分类器(k-NN)分类头中表…

java-8组合式异步编程

11.1 Future 接口 Future接口在Java5中被引人,设计初衷是对将来某个时刻会发生的结果进行建模。它建模了一种异步计算,返回一个执行运算结果的引用,当运算结束后,这个引用被返回给调用方。在Future中触发那些潜在耗时的操作把调用…

【VSCode】使用笔记

目录 快捷键系列 相关插件 相关文档链接 快捷键系列 调出终端 ctrl 或者是ctrlJ 结束进程 ctrlc 注释 ctrlkc 取消注释 ctrlku 上下移动代码 alt方向键 多行光标ctrlalt方向键 快速跳过某个单词 ctrl方向键 相关插件 1.每次修改后,自动保存启动项目 相…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱6(附带项目源码)

效果演示 文章目录 效果演示系列目录前言存储加载物品信息源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将探索如何用unity制作一个3D背包、库存、制作、快…

黄金交易策略(Nerve Nnife.mql4):移动止盈的设计

完整EA:Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 相较mt4的止盈止损,在ea上实现移动止盈,可以尽最大可能去获得更高收益。移动止盈的大体逻辑是:到达止盈点就开始追踪止盈,直到在最高盈利点回撤指定点数即平…