摘要
在配制服务项目中增加一个Json配制读取类,继续继承IConfig接口。
是否可以简化服务注册?
正文
创建一个Json配置文件
{
"SmtpServer": "smtp.163.com",
"UserName": "admin",
"Password": "123456"
}
在ConfigServices项目中添加一个JsonConfigProvider类
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConfigServices
{
public class JsonConfigProvider : IConfig
{
private EmailConfig emailConfig;
private string fileName = "";
public JsonConfigProvider()
{
}
public JsonConfigProvider(string fileName)
{
this.fileName = fileName;
emailConfig = JsonConvert.DeserializeObject<EmailConfig>(File.ReadAllText(this.fileName));
}
public string Value(string key)
{
Type t = emailConfig.GetType();
var p= t.GetProperty(key).GetValue(emailConfig, null);
return p.ToString();
}
}
public class EmailConfig
{
public string SmtpServer { get; set; } = "";
public string UserName { get; set; } = "";
public string Password { get; set; } = "";
}
}
调用
internal class Program
{
static void Main(string[] args)
{
ServiceCollection services=new ServiceCollection();
services.AddScoped(typeof(IConfig), x => new JsonConfigProvider("config.json"));
//services.AddScoped<ILog, LogProvider>();
services.AddScoped<IEmail,EmailProvider>();
services.AddLogScoped();//我们通过静态扩展可以做成这样
using (var sp = services.BuildServiceProvider())
{
var provider = sp.GetRequiredService<IEmail>();
provider.SendEmail("test", "body", "admin@admin.com");
}
}
}
其中LogServices中我们添加一个扩展类LogExtension
using LogServices;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Microsoft.Extensions.DependencyInjection
{
public static class LogExtension
{
public static void AddLogScoped(this IServiceCollection serives)
{
serives.AddScoped<ILog,LogProvider>();
}
}
}
ConfigServices项目,同理可以添加一个静态方法
namespace Microsoft.Extensions.DependencyInjection
{
public static class ConfigExtension
{
public static void AddConfigScope(this IServiceCollection serives,string fileName)
{
serives.AddScoped(typeof(IConfig),x=>new JsonConfigProvider(fileName));
}
}
}
调用时修改
//services.AddScoped(typeof(IConfig), x => new JsonConfigProvider("config.json"));
services.AddConfigScope("config.json");