Jou*_*and 5 c# asp.net-core-mvc asp.net-core asp.net-core-2.0
我想从数据库中注入一些电子邮件配置数据到命名的配置类AuthMessageSenderOptions,这个类有以下属性:
public class AuthMessageSenderOptions
{
public int PortNumber { get; set; }
public string SmtpServer { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
为了将配置细节注入appsettings.json到AuthMessageSenderOptions类中,我使用以下代码Startup.cs:
services.Configure<AuthMessageSenderOptions>(Configuration.GetSection("SMTP"));
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:
如何从数据库中读取这些数据而不是appsettings.json将它们注入我的AuthMessageSenderOptions课程以供将来使用?
Ism*_*sma 11
您可以通过创建实现接口的类IConfigurationSource并通过继承来实现自定义配置提供程序来创建自定义配置源ConfigurationProvider.
首先,创建一个配置源来使用实体框架初始化数据源:
public class CustomMailConfigSource: IConfigurationSource
{
private readonly Action<DbContextOptionsBuilder> _dbOptions;
public CustomMailConfigSource(Action<DbContextOptionsBuilder> dbOptions)
{
_dbOptions = dbOptions;
}
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new CustomMailConfigProvider(_dbOptions);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,实现自定义配置提供程序:
public class CustomMailConfigProvider: ConfigurationProvider
{
public CustomMailConfigProvider(Action<DbContextOptionsBuilder> dbOptions)
{
DbOptions = dbOptions;
}
Action<DbContextOptionsBuilder> DbOptions { get; }
public override void Load()
{
var builder = new DbContextOptionsBuilder<ConfigurationContext>();
DbOptions(builder);
using (var dbContext = new ConfigurationContext(builder.Options))
{
dbContext.Database.EnsureCreated();
//Modify this to suit your needs, here is an example assuming you have a table called AuthMessageSenderOption with the same fields as the class in your question
var authMessageSender = db.Context.AuthMessageSenders.FirstOrDefault();
// You should add some code here to check if the settings exist and provide defaults if necessary
Data = new Dictionary<string, string>
{
{ "PortNumber", authMessageSenderOption.PortNumber},
{ "SmtpServer", authMessageSenderOption.SmtpServer },
{ "UserName", authMessageSenderOption.UserName},
{ "Password", authMessageSenderOption.Password}
};
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后,您需要注册自定义配置提供程序.
创建IConfigurationBuilder扩展:
public static class CustomProviderExtensions
{
public static IConfigurationBuilder AddCustomMailConfigProvider(
this IConfigurationBuilder builder, Action<DbContextOptionsBuilder> dbOptions)
{
return builder.Add(new CustomMailConfigSource(dbOptions));
}
}
Run Code Online (Sandbox Code Playgroud)
Main()使用刚刚创建的扩展名在方法中注册提供程序:
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
// Add "appsettings.json" to bootstrap EF config.
.AddJsonFile("appsettings.json")
// Add the EF configuration provider, which will override any
// config made with the JSON provider.
.AddCustomMailConfigProvider(dbOptions =>
dbOptions .UseSqlServer(connectionStringConfig.GetConnectionString(
"DefaultConnection"))
)
.Build();
Run Code Online (Sandbox Code Playgroud)
参考文献:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?tabs=basicconfiguration
| 归档时间: |
|
| 查看次数: |
721 次 |
| 最近记录: |