.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文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?