当前位置: 首页 > news >正文

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

相关文章:

  • OpenAI Sora 初体验
  • Android Compose 一个音视频APP——Magic Music Player
  • Arrays工具类的常见方法总结
  • 高校疫情防控系统的全栈开发实战
  • Day37 贪心算法part06
  • Acwing 周赛143 解题报告 | 珂学家 | 状压DP
  • 信息学奥赛一本通1177:奇数单增序列
  • DS:二叉树的顺序结构及堆的实现
  • MATLAB | 情人节画个花瓣venn图?
  • 002 - Hugo, 自动部署博客
  • Linux第52步_移植ST公司的linux内核第4步_关闭内核模块验证和log信息时间戳_编译_并通过tftp下载测试
  • 关于Build Your Own Botnet的尝试
  • 如何用 ChatGPT 做项目管理?
  • 吴恩达机器学习全课程笔记第一篇
  • 第十五章 以编程方式使用 SQL 网关 - %SQLGatewayConnection 方法和属性
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • Android框架之Volley
  • CSS实用技巧干货
  • in typeof instanceof ===这些运算符有什么作用
  • java2019面试题北京
  • JavaWeb(学习笔记二)
  • Laravel 中的一个后期静态绑定
  • mysql 5.6 原生Online DDL解析
  • TypeScript实现数据结构(一)栈,队列,链表
  • vuex 笔记整理
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • XML已死 ?
  • 欢迎参加第二届中国游戏开发者大会
  • 机器学习学习笔记一
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 应用生命周期终极 DevOps 工具包
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #define、const、typedef的差别
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (c语言)strcpy函数用法
  • (八)Flask之app.route装饰器函数的参数
  • (十)c52学习之旅-定时器实验
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)Controller接口控制器详解(三)
  • (转)Unity3DUnity3D在android下调试
  • (转)visual stdio 书签功能介绍
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • *1 计算机基础和操作系统基础及几大协议
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(六):替换字符串中匹配的子串
  • .net core Swagger 过滤部分Api
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET 读取 JSON格式的数据
  • .NET关于 跳过SSL中遇到的问题
  • .net开发引用程序集提示没有强名称的解决办法