.NET Framework & .NET Core 的 EntityFramework 配置提供程序





5.00/5 (4投票s)
Configuration.EntityFramework 是一个基于 EntityFrameworkCore 构建的 .NET Core 配置系统的自定义配置提供程序。
onfiguration.EntityFramework
引言
.NET Core 支持多种不同的配置选项。应用程序配置数据可以来自文件(内置支持 JSON、XML 和 INI 格式),也可以来自环境变量、命令行参数,甚至内存集合。那么为什么没有对 EntityFramework 的支持呢?现在有了!
Configuration.EntityFramework
是 .NET Core 配置系统 的一个自定义配置提供程序。它构建于 EntityFrameworkCore 之上,允许将配置设置存储在各种 存储库 中。
某些设置,例如连接字符串或应用程序初始化期间所需的设置,可能更适合放在本地文件而不是存储库中。然而,在许多情况下,Configuration.EntityFramework
可以提供一些显著的优势,包括:
- 利用 .NET Core 配置提供程序模型,
- 支持复杂类型,
- 使用 Options 模式 以强类型方式访问设置,
- 增强的配置管理和变更控制。这在分布式环境中尤其重要,
- 对整个环境的设置进行事务性更新,
- 通用设置可以被许多应用程序共享。支持单点更改,
- 在一个包含许多相关应用程序或服务的复杂系统中,拥有许多配置文件并不少见。通过将设置持久化到数据库,可以减少对这些配置文件的依赖,
- 可以检索所有符合特定条件(例如环境、应用程序或部分)的设置,只需一次查询,
- 允许最终用户通过 EntityFramework Context 更新设置。
背景
采用 Configuration.EntityFramework 的一些用例
使用 Configuration.EntityFramework
并将设置持久化到数据库有很多引人注目的用例。但是,这里我们只介绍其中的几个。
深度软件栈
在许多情况下,尤其是在企业系统中,软件栈可能由许多部分组成,例如 Windows 服务、Web 应用程序、Web API 和桌面应用程序。这些部分中的每一部分很可能都有自己的配置文件,这些配置文件必须进行部署和维护。使用 Configuration.EntityFramework
,可以集中存储和维护与这些部分相关的设置,从而减少软件部署、升级和频繁或偶尔的配置更改相关的 effort 和风险。
分布式解决方案
在分布式解决方案中,配置文件将存在于一个以上的服务器上。在集群环境中,相同的配置文件可能复制到许多服务器上,所有这些服务器都可能完全相同。使用 Configuration.EntityFramework
,可以从单一事实来源管理设置,但可供任何资源使用。
发布管理
配置文件会为发布管理过程增加额外的复杂性。在添加、删除或修改设置时,需要考虑许多变量,包括:
- 版本控制
- 自上次部署以来,设置是否已被客户修改?
- 是否需要有条件合并?
由于 Configuration.EntityFramework
利用 EntityFrameworkCore
将配置设置持久化到关系数据库,因此可以通过多种方式管理配置数据,包括脚本或通过 EF ConfigurationContext
。
原子更新
当存在许多配置文件,可能位于许多服务器上时,维护这些文件的完整性至关重要。要更改单个设置,必须进行经过深思熟虑的备份和恢复策略(恢复计划)。然而,通过将这些设置持久化到数据库,可以大大减少所涉及的后勤工作和进行更改所需的系统停机时间。
Using the Code
入门非常简单。
步骤 1
安装最新的 Nuget 包。
第二步
创建与 EntityFrameworkCore
和 ConfigurationContext
兼容的存储库。
步骤 3
步骤 4
通过调用 ConfigurationBuilder
上的 AddEntityFrameworkConfig
扩展方法,将 Configuration.EntityFramework
提供程序注册并初始化到 IConfiguration 实例。 this.
var config = new ConfigurationBuilder()
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appsettings.json", true, true)
.AddEntityFrameworkConfig(builder => builder.UseSqlServer
(@"Data Source=.;Initial Catalog=Configuration;Integrated Security=True"))
.Build();
快速入门
完成步骤 1-4 后,您就可以开始访问您的设置了。
以下代码片段提供了通过 ConfigurationBuilder.Build()
方法返回的 IConfiguration
实例检索设置的示例代码。
检查配置部分是否存在。
var exists = config.SectionExists("SampleSection");
获取复杂类型的配置部分。如果部分不存在,则返回 null。
var section = config.TryGetSection<ComplexType>("SampleSection");
获取复杂类型的配置部分。如果部分不存在,则返回默认值。
var section = config.GetSection<ComplexType>("SampleSection");
获取键的配置值。
var setting = config.GetValue<string>("TestSetting");
配置连接字符串
由于 Configuration.EntityFramework
提供程序正在检索持久化到数据库的设置,因此需要 ConnectionString
。此 ConnectionString
可以通过 DbContextOptionBuilder 进行配置,如下面的示例所示。
var config = new ConfigurationBuilder()
.AddEntityFrameworkConfig(builder =>
builder.UseSqlServer(@"Data Source=.;Initial Catalog=Configuration;Integrated Security=True"))
.Build();
或者,可以将 ConnectionString
添加到本地配置设置中。对于 .xproj 项目,这意味着 appsettings.json 文件。
{
"ConnectionStrings": {
"ConfigurationContext": "Data Source=.;Initial Catalog=Configuration.Samples;
Integrated Security=True"
}
}
关注点
访问我们的 wiki 以获取更多信息,包括:
从 GitHub 下载最新的示例代码。
历史
- 2016 年 10 月 21 日:初始版本