首页 > 其他分享 >DependencyInjection组件的综合应用案例(3)

DependencyInjection组件的综合应用案例(3)

时间:2023-12-18 17:58:26浏览次数:19  
标签:string 案例 void services 组件 DependencyInjection 日志 config public

目的:通过一个较综合的案例演示依赖注入的使用

需求:有配置服务、日志服务,然后再开发一个邮件发送器服务。

           可以通过配置服务来从文件、环境变量、数据库等地方读取配置,

           可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。

说明:配置服务和日志服务.net中都有现有的框架,这篇文章只是为了演示依赖注入重写写了这两个服务,没有实际作用,邮件发送也只是用控制台来显示,不是实际的发送邮件

项目分3个服务类库项目和1个应用程序项目,如下

1、配置服务项目

 /// <summary>
 /// 配置提供者
 /// </summary>
 public interface IConfigProvider
 {
     /// <summary>
     /// 根据名称获取值
     /// </summary>
     /// <param name="Name"></param>
     /// <returns></returns>
     string GetValue(string Name);
 }

 class EnvVarConfigProvider : IConfigProvider
{
    public string GetValue(string Name)
    {
       return Environment.GetEnvironmentVariable(Name);
    }
}

public static class ConfigProviderExtensions
{

    public static void AddEnvVarConfig(this IServiceCollection services)
    {
        services.AddScoped<IConfigProvider, EnvVarConfigProvider>();
    }

}

AddEnvVarConfig是一个扩展方法,使用扩展方法进行注册的好处是:应用者无需关注具体的实现类,使用时只需service.AddEnvVarConfig()即可,所以EnvVarConfigProvider类不需public

 2、日志服务项目

/// <summary>
/// 日志提供者
/// </summary>
public interface ILogProvider
{
    /// <summary>
    /// 记录错误信息
    /// </summary>
    /// <param name="mes"></param>
    void LogError(string mes);
    /// <summary>
    /// 记录普通信息
    /// </summary>
    /// <param name="mes"></param>
    void LogInfo(string mes);
}


    /// <summary>
    /// 控制台日志提供者
    /// </summary>
     class ConsoleLogProvider : ILogProvider
    {
        public void LogError(string mes)
        {
            Console.WriteLine($"Error:{mes}");
        }

        public void LogInfo(string mes)
        {
            Console.WriteLine($"Info:{mes}");
        }
    }

public static class ConsoleLogProviderExtensions
{
    public static void AddLog(this IServiceCollection services)
    {
        services.AddScoped<ILogProvider, ConsoleLogProvider>();
    }
}

3、邮件服务项目

/// <summary>
/// 邮件发送接口
/// </summary>
public interface IMailSender
{
    void Send(string title,string to,string msg);
}

 class DefaultMailSender : IMailSender
{ 
    private readonly ILogProvider log;
    private readonly IConfigProvider config;

    public DefaultMailSender(ILogProvider log, IConfigProvider config)//通过构造注入日志系统和配置系统
    {
        this.log = log;
        this.config = config;
    }
   //只是为了演示依赖注入,不是实际的邮件发送
    public void Send(string title, string to, string msg)
    {
        log.LogInfo("准备发送邮件");
        string smpt = config.GetValue("Smpt");
        string user = config.GetValue("User");
        string password = config.GetValue("Password");
        Console.WriteLine($"邮件服务器地址:{smpt},账号:{user},密码:{password}");
        Console.WriteLine($"向{title},{to}发送邮箱,{msg}");
    }

   
}

 public static class MailServiceExtensions
 {
     public static void AddMail(this IServiceCollection services)
     {
         services.AddScoped<IMailSender, DefaultMailSender>();
     }
 }

4、邮件发送应用程序

 因为配置服务目前只实现了一个简单的环境变量读取,所以在运行时需要先配置下环境变量,以下是我的环境变量配置

 

 internal class Program
 {
     static void Main(string[] args)
     {
         ServiceCollection services = new ServiceCollection();
         services.AddLog();
         services.AddEnvVarConfig();
         services.AddMail();

        using(ServiceProvider sp=services.BuildServiceProvider())
         {
            
             IMailSender mailSender = sp.GetRequiredService<IMailSender>();
             mailSender.Send("[email protected]", "Lily", "hello,Nice to meet you");
         }
     }
 }

 

运行结果:

 

标签:string,案例,void,services,组件,DependencyInjection,日志,config,public
From: https://www.cnblogs.com/luohualiushui1173/p/17911161.html

相关文章

  • 验证码组件开发,本地缓存倒计时
    vue组件<template><divclass="verifyCodemt-24"><divclass="header"><spanclass="logoinline-blockmr-6w-[26px]h-[26px]bg-black-0"></span><spanclass=&......
  • kettle组件控制操作MySQL
    使用kettle执行脚本:然后保存执行实现以下效果;转换参数:实现变量转换:deletefromtestwhereuserid='${userid}';实现效果:100被删除......
  • 工银安盛&原点安全:一体化大数据使用安全与合规解决方案|入选中国信通院「星熠」案例
    近日,为推动数据安全产业蓬勃、可持续发展,发挥优秀案例示范引领作用,加强优秀案例推广,中国信息通信研究院“数据安全共同体计划”于今年 7 月启动数据安全“星熠”案例遴选工作,历时 5 个月的案例征集、初评、答辩和终评,于 2023 年 12 月初,中国信息通信研究院“数据安全共同体......
  • 函数function及案例
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title></head><body><script>/*Function函数是一个复杂的数据类型......
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Text文本组件
    鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之文本组件一、操作环境操作系统: Windows10专业版IDE:DevEcoStudio3.1SDK:HarmonyOS3.1编辑二、文本组件Text 是显示文本的基础组件之一,它可以包含子组件 Span ,当包含 Span 时不生效,只显示 Span 的内容。Text('我是Text'){Span('......
  • 记三次升级 TiDB 集群到 v6.1.5 遇到的案例分析过程&升级收益
    作者:Yifei_Jia团队升级TiDB版本的事情是规划很久了,迟迟没操作还是因为很多预期意外的问题是否有能力覆盖解决。本文写的时间是8月底,今天刚好总结的时候看到了分享给大家以作为版本升级的参考。我们的业务集群TiDB数据量本身是很大,单集群数十TB规模,加之业务的重要性,本着非必要不升......
  • 十三、组件-通用属性-点击事件
    组件是构建页面的核心,每个组件通过对数据和方法的简单封装,实现独立的可视、可交互功能单元。组件之间相互独立,随取随用,也可以在需求相同的地方重复使用。@Entry@ComponentstructClick{@Statetext:string=''build(){Column(){Row({space:20}){......
  • React useEffect 在组件挂载时运行了两次
    在使用useEffect这个hook时,发现useEffect会执行2次useEffect(()=>{console.log("执行useEffect");},[]);控制台输出:执行useEffect执行useEffect查看疑难解答官方文档,官方解释如下:在开发环境下,如果开启严格模式,React会在实际运行setup之前额外运行一次......
  • NodeRed入门案例,在控制台输出Hello World!
    1、打开NodeRed软件,将inject控件拖入到流程绘制区域,因为我们需要提供HelloWorld!的输入内容。2、将debug控件拖入到流程绘制区域,因为我们要将输入到Inject控件输入的内容输出到控制台(调试窗口)。3、将控件连接并部署。4、测试编写的流程。5、点击inject控件的左侧按钮触......
  • 2、SpringBoot2之入门案例
    2.1、创建Maven工程2.1.1、创建空项目2.1.2、设置项目名称和路径2.1.3、设置项目sdk2.1.4、项目初始状态注意:需要关闭项目再重新打开,才能看到SpringBoot-Part文件夹2.1.5、配置maven2.1.6、创建module右击SpringBoot-Part文件夹,创建新module选择maven配......