.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文件
posted @ 2022-06-29 12:02  Wilson_it  阅读(40)  评论(0编辑  收藏  举报