EF定制配置提供程序OnReload。

3

我正在查阅有关实现自定义配置提供程序的[Microsoft文档][1],并尝试创建一个Entity Framework配置提供程序,但我很难理解重新加载配置。

我在网上看到的示例是基于记录更改来重新加载配置,但我只想在某个间隔时间进行简单的重新加载。这可能吗?

这是我的配置源:

public class EFConfigurationSource : IConfigurationSource
{
    private readonly Action<DbContextOptionsBuilder> _optionsAction;

    public EFConfigurationSource(Action<DbContextOptionsBuilder> optionsAction)
    {
        _optionsAction = optionsAction;
    }
    
    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new EFConfigurationProvider(_optionsAction);
    }
}

配置提供程序:

public class EFConfigurationProvider : ConfigurationProvider
{
    public EFConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction)
    {
        OptionsAction = optionsAction;
    }

    Action<DbContextOptionsBuilder> OptionsAction { get; }
    public override void Load()
    {
        var builder = new DbContextOptionsBuilder<MyDBContext>();

        OptionsAction(builder);

        using (var dbContext = new MyDBContext(builder.Options))
        {
            Data = dbContext.SomeConfigurationTable.ToDictionary(x => x.ConfigCd, x => x.ConfigValue);
        }
    }
}

我使用扩展方法将其添加到我的应用程序配置中:

public static class EntityFrameworkExtensions
{
    public static IConfigurationBuilder AddEFConfiguration(this IConfigurationBuilder builder, Action<DbContextOptionsBuilder> optionsAction)
    {
        return builder.Add(new EFConfigurationSource(optionsAction));
    }
}

注册它:

public static IHostBuilder CreateHostBuilder(string[] args)
{
    ...
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        // Create a temporary IConfiguration to read in values needed on building the host.
        IConfiguration appConfig = new ConfigurationBuilder().AddJsonFile("appsettings.json", false, false).Build();

        config.AddEFConfiguration(options => options.UseSqlServer(appConfig.GetConnectionString("RTPConnection")));
    });
    
    ...
}

如何实现在更改时重新加载?

重新加载更改未被实现,因此在应用程序启动后更新数据库将不会影响应用程序的配置。 [1]: https://learn.microsoft.com/en-us/dotnet/core/extensions/custom-configuration-provider

2个回答

2
你可以通过手动重新加载配置来解决这个问题。
 var root = configuration as IConfigurationRoot;
 var provider = root.Providers.FirstOrDefault(p => p is EFConfigurationProvider);
 provider.Load();

注意:如果您正在使用 IOptionMonitor 或 IOptionSnapshot,您还应该在加载数据后调用 OnReload() 方法以触发 OnChange 事件。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接