当前位置:首页 > Web开发 > 正文

public class DbConfigurationSource : IConfigurationSource {

2024-03-31 Web开发

标签:

我们在前面对配置模型中默认供给的各类IConfigurationSource实现类型进行了深入详尽的介绍,如果它们依然不能满足项目中的需求,我们还可以通过自界说IConfigurationSource实现类型来撑持我们但愿的配置源。就配置数据的长期化方法来说,将配置存储在数据库中应该是一种常见的方法。接下来我们会创建一个针对数据库的IConfigurationSource实现类型,它给与Entity Framework Core来完成数据库的存取操纵。

我们将这个自界说ConfigurationSource定名为DbConfigurationSource。在正式介绍它的实现之前,我们先来看看它在项目中的应用。我们将配置生存在SQL Server数据库中的某个数据表中,并给与Entity Framework Core来读取它。我们将连接字符串作为配置界说在一个名为“appSettings.json”的JSON文件中。

{ "connectionStrings": { "DefaultDb": "Server = ... ; Database=...; Uid = ...; Pwd = ..." } }

在如下所示的演示措施中,我们首先创建了一个ConfigurationBuilder东西,并在它上面注册了一个指向connectionString.json文件的JsonConfigurationSource东西。针对DbConfigurationSource东西的注册表此刻扩展要领AddDatabase上,这个要领具有两个参数,分袂代表连接字符串的名称和初始的配置数据。前者正是connectionString.json设置的连接字符串名称DefaultDb,后者是一个字典东西,它供给的原始配置正好可以组成一个Profile东西。在操作ConfigurationBuilde东西创建出相应的IConfiguration东西之后,我们读取配置将其绑定为一个Profile东西。

public class Program
{
static void Main()
{
var initialSettings = new Dictionary<string, string>
{
["Gender"] = "Male",
["Age"] = "18",
["ContactInfo:EmailAddress"] = "[email protected]",
["ContactInfo:PhoneNo"] = "123456789"
};

var profile = new ConfigurationBuilder() .AddJsonFile("appSettings.json") .AddDatabase("DefaultDb", initialSettings) .Build() .Get<Profile>(); Debug.Assert(profile.Gender == Gender.Male); Debug.Assert(profile.Age == 18); Debug.Assert(profile.ContactInfo.EmailAddress == "[email protected]"); Debug.Assert(profile.ContactInfo.PhoneNo == "123456789"); }

}
如上面的代码片断所示,针对DbConfigurationSource的应用仅仅表此刻我们为IConfigurationBuilder东西界说的AddDatabase扩展要领上,所以使用起来长短常便利的,那么这个扩展要领背后有着怎样的逻辑实现呢?DbConfigurationSource给与Entity Framework Core并以Code First的方法进行数据操纵,如下所示的ApplicationSetting是暗示根基配置项的POCO类型,我们将配置项的Key以小写的方法存储。另一个ApplicationSettingsContext是对应的DbContext类型。

[Table("ApplicationSettings")]
public class ApplicationSetting
{
private string key;

[Key] public string Key { get { return key; } set { key = value.ToLowerInvariant(); } } [Required] [MaxLength(512)] public string Value { get; set; } public ApplicationSetting() { } public ApplicationSetting(string key, string value) { Key = key; Value = value; }

}

public class ApplicationSettingsContext : DbContext
{
public ApplicationSettingsContext(DbContextOptions options) : base(options)
{ }

public DbSet<ApplicationSetting> Settings { get; set; }

}
如下所示的是DbConfigurationSource类型的界说,它的结构函数具有两个参数,第一个参数类型为Action<DbContextOptionsBuilder>,,我们用这个委托东西来对创建DbContext给与的DbContextOptions进行设置,另一个可选的参数用来指定一些需要自动初始化的配置项。DbConfigurationSource在重写的Build要领中操作这两个东西 创建一个DbConfigurationProvider东西。

public class DbConfigurationSource : IConfigurationSource
{
private Action<DbContextOptionsBuilder> _setup;
private IDictionary<string, string> _initialSettings;

public DbConfigurationSource(Action<DbContextOptionsBuilder> setup, IDictionary<string, string> initialSettings = null) { _setup = setup; _initialSettings = initialSettings; } public IConfigurationProvider Build(IConfigurationBuilder builder) { return new DbConfigurationProvider(_setup, _initialSettings); }

}
DbConfigurationProvider派生于抽象类ConfigurationProvider。在重写的Load要领中,它会按照供给的Action<DbContextOptionsBuilder>创建ApplicationSettingsContext东西,并操作它从数据库中读取配置数据并转换成字典东西并赋值给代表配置字典的Data属性 。如果数据表中没有数据,该要领还会操作这个DbContext东西将供给的初始化配置添加到数据库中。

public class DbConfigurationProvider: ConfigurationProvider { private readonly IDictionary<string, string> _initialSettings; private readonly Action<DbContextOptionsBuilder> _setup; public DbConfigurationProvider(Action<DbContextOptionsBuilder> setup, IDictionary<string, string> initialSettings) { _setup = setup; _initialSettings = initialSettings?? new Dictionary<string, string>() ; } public override void Load() { var builder = new DbContextOptionsBuilder<ApplicationSettingsContext>(); _setup(builder); using (ApplicationSettingsContext dbContext = new ApplicationSettingsContext(builder.Options)) { dbContext.Database.EnsureCreated(); Data = dbContext.Settings.Any() ? dbContext.Settings.ToDictionary(it => it.Key, it => it.Value, StringComparer.OrdinalIgnoreCase) : Initialize(dbContext); } } private IDictionary<string, string> Initialize( ApplicationSettingsContext dbContext) { foreach (var item in _initialSettings) { dbContext.Settings.Add(new ApplicationSetting(item.Key, item.Value)); } return _initialSettings.ToDictionary(it => it.Key, it => it.Value, StringComparer.OrdinalIgnoreCase); } }

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/33141.html