• .NET CORE 依赖注入2


    1.使用静态方法 注册服务,使用到的NuGet包:Microsoft.Extensions.DependencyInjection.Abstractions

    Microsoft.Extensions.DependencyInjection

     public interface IConfigService
        {
            string GetValue(string name);
        }
       //读取INI文件中的配置信息
      public class IniConfigService : IConfigService
        {
            public string FilePath { get; set; }
            public string GetValue(string name)
            {
            var res= File.ReadAllLines(FilePath).Select(x => x.Split("=")).Select(x => new { Name = x[0], Value = x[1] }).SingleOrDefault(x => x.Name == name);
    
     return res == null ? "" : res.Value;
    
    }
    
    }
    //使用扩展方法 方便注入
    namespace Microsoft.Extensions.DependencyInjection
    {
        public static class IniFileConfigExtension
        {
    
            public static void AddIniFileConfig(this IServiceCollection service,string filePath)
            {
                //  service.AddScoped<IConfigService, IniConfigService>();
                service.AddScoped(typeof(IConfigService), x => new IniConfigService { FilePath = filePath });
            }
        }
    }
    
      public interface ILogProvider
        {
            void LogError(string msg);
            void LogInfo(string msg);
        }
    
       public class ConsoleLogProvider : ILogProvider
        {
            public void LogError(string msg)
            {
                Console.BackgroundColor=ConsoleColor.Black;
                Console.ForegroundColor=ConsoleColor.Red;
                Console.WriteLine($"ERROR:{msg}");
            }
    
            public void LogInfo(string msg)
            {
                Console.BackgroundColor = ConsoleColor.Black;
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.WriteLine($"INFO:{msg}");
            }
        }
    
    namespace Microsoft.Extensions.DependencyInjection
    {
        public static class ConsoleLogExtension
        {
            public static void AddConsoleLog(this IServiceCollection service)
            {
                service.AddScoped<ILogProvider, ConsoleLogProvider>();
            }
        }
    }
    
     public interface IMailService
        {
            void SendMail(string title,string Content,string to);
        }
    
    
    public class MailService : IMailService
        {
            private readonly ILogProvider log;
            private readonly IConfigService config;
            //使用构造方法注入的方式 
            public MailService(ILogProvider log, IConfigService config)
            {
                this.log = log;
                this.config = config;
            }
            public void SendMail(string title, string Content, string to)
            {
    
                log.LogInfo("发送开始----");
                log.LogError(config.GetValue("password"));
    
                Console.WriteLine("发送邮件");
            }
        }  
       //在program中调用
         ServiceCollection services = new ServiceCollection();
         services.AddConsoleLog();
         services.AddIniFileConfig("mail.ini");
         services.AddMail();
         using ( ServiceProvider  sp=services.BuildServiceProvider() )
        {
    	var mailsender=  sp.GetService<IMailService>();
    	mailsender.SendMail("111", "222", "sss@sina.com");
        }
            
        //实现一个从多种目标源中读取配置信息并且进行覆盖的
        //添加一个接口   
     public interface  IConfigReader
        {
            string GetValue(string name);
        }
       
    //配置读取实现  这里主要从IConfigService 的多个实现中去读取配置信息
     public class LayerConfigService : IConfigReader
        {
    
            private readonly IEnumerable<IConfigService> services;
            public LayerConfigService(IEnumerable<IConfigService> services)
            {
                this.services = services;   
            }
            public string GetValue(string name)
            {
                string value = "";
                foreach (var item in services)
                {
                    string newValue = item.GetValue(name);
                    if(newValue != null)
                    {
                        value = newValue;
                    }
                }
                return  value;
            }
        }
    
     //加多一种从环境变量中读取配置的实现
     public class EnviromentService : IConfigService
        {
            public string GetValue(string name)
            {         
               return Environment.GetEnvironmentVariable(name);
            }
        }
     //MailService中将依赖的接口进行修改
     public class MailService : IMailService
        {
           //主要将IConfigService 修改为IConfigReader 
            private readonly ILogProvider log;
            //  private readonly IConfigService config;
            private readonly IConfigReader config;
            public MailService(ILogProvider log, IConfigReader config)
            {
                this.log = log;
                this.config = config;
            }
            public void SendMail(string title, string Content, string to)
            {
    
                log.LogInfo("发送开始----");
                log.LogError(config.GetValue("password"));
    
                Console.WriteLine("发送邮件");
            }
        }
       //实际执行会按照注册服务的先后顺序更新读到的配置信息
    services.AddConsoleLog();
    services.AddIniFileConfig("mail.ini");
    services.AddMail();
    services.AddLayerConfig();
    services.AddScoped<IConfigService, EnviromentService>();//EnviromentService环境变量中的配置信息的优先级高于ini文件
    
  • 相关阅读:
    MFC
    驱动学习
    Ubuntu下为Apache简单配置SSL的方法(HTTPS的实现)
    在linux下helloworld的C程序
    swift安装,linux
    gcc,cc,g++,CC的区别
    ldconfig与 /etc/ld.so.conf
    ubuntu16.04,mysql5.7重启不成功。Restarting mysql (via systemctl): mysql.serviceJob for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service"
    linux .o,.a,.so文件
    zipgateway-2-61-0的安装
  • 原文地址:https://www.cnblogs.com/wilsonNet/p/16422825.html
Copyright © 2020-2023  润新知