ASP.NET Core 配置 - 创建自定义配置提供程序

在本文中,我们将创建一个自定义配置提供程序,从数据库读取我们的配置。我们已经了解了默认配置提供程序的工作方式,现在我们将实现我们自己的自定义配置提供程序。

对于自定义配置提供程序,我们将使用 Entity Framework Core,并结合 SQL Server 数据库。

在这篇文章中,我们将讨论:

•初始化 EF Core•实现自定义 EF Core 提供程序•运行应用程序•结论

首先,让我们使用数据库优先方法升级我们的解决方案以支持 EF Core 。

初始化 EF Core

在我们开始之前,我们需要先安装两个 Nuget 包: PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer -v 3.1.7

我们需要这个包,因为我们将使用 SQL Server 实例,并且: PM> Install-Package Microsoft.EntityFrameworkCore.Tools -v 3.1.7

因为我们将通过 CLI 执行数据库的初始创建和迁移。

我们需要一个包含键值配置对的类(Models 文件夹):

public class ConfigurationEntity
{[Key]public string Key { get; set; }public string Value { get; set; }
}

和一个DbContext类(模型文件夹):

public class ConfigurationDbContext : DbContext
{public ConfigurationDbContext(DbContextOptions options): base(options){}public DbSet<ConfigurationEntity> ConfigurationEntities { get; set; }
}

我们只需要一个DbSetConfigurationEntity,这将映射到我们的数据库中的表。

现在我们只需要ConfigureServices()Startup类中的方法中建立到我们的服务器的连接:

services.AddDbContext<ConfigurationDbContext>(opts =>opts.UseSqlServer(Configuration.GetConnectionString("sqlConnection")));

当然,您需要将appsettings.json文件中的连接字符串更改为您的数据库。如果您使用的是 SqlExpress,它很可能如下所示:

"ConnectionStrings": {"sqlConnection": "server=.\\SQLEXPRESS; database=CodeMazeCommerce; Integrated Security=true"
},

就是这样,现在我们可以简单地通过包管理器控制台添加初始迁移: PM> Add-Migration InitialSetup

并将该迁移应用于数据库: Update-Database

现在我们的数据库已创建并准备好用于存储配置数据。

实现自定义 EF Core 提供程序

首先,让我们在 Models 文件夹中创建一个文件夹 ConfigurationProviders,以便正确地对我们的类进行分组。

之后,我们需要通过继承ConfigurationProvider类来实际创建一个配置提供者。我们将在ConfigurationProviders文件夹中创建我们自己的提供程序类并将其命名为EFConfigurationProvider

public class EFConfigurationProvider : ConfigurationProvider
{public EFConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction){OptionsAction = optionsAction;}Action<DbContextOptionsBuilder> OptionsAction { get; }public override void Load(){var builder = new DbContextOptionsBuilder<ConfigurationDbContext>();OptionsAction(builder);using (var dbContext = new ConfigurationDbContext(builder.Options)){dbContext.Database.EnsureCreated();Data = !dbContext.ConfigurationEntities.Any()? CreateAndSaveDefaultValues(dbContext): dbContext.ConfigurationEntities.ToDictionary(c => c.Key, c => c.Value);}}private static IDictionary<string, string> CreateAndSaveDefaultValues(ConfigurationDbContext dbContext){var configValues =new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase){{ "Pages:HomePage:WelcomeMessage", "Welcome to the ProjectConfigurationDemo Home Page" },{ "Pages:HomePage:ShowWelcomeMessage", "true" },{ "Pages:HomePage:Color", "black" },{ "Pages:HomePage:UseRandomTitleColor", "true" }};dbContext.ConfigurationEntities.AddRange(configValues.Select(kvp => new ConfigurationEntity{Key = kvp.Key,Value = kvp.Value}).ToArray());dbContext.SaveChanges();return configValues;}
}

这门课乍一看可能有点吓人,但其实没那么吓人。

构造函数有一个参数,即委托Action<DbContextOptionsBuilder> optionsAction。稍后我们将使用DbContextOptionsBuilder该类为我们的数据库定义上下文。我们之前定义连接字符串时已经完成了。我们公开了上下文选项构建器,以便向我们的自定义提供程序提供该选项。

我们正在重写该Load()方法,以便ConfigurationEntity使用数据库中的数据填充我们的方法,或者如果数据库表为空,则创建一些默认的方法。这里的所有都是它的。

接下来,我们要将我们的配置提供程序注册为源。为了做到这一点,我们需要实现IConfigurationSource接口。所以让我们EFConfigurationSourceConfigurationProviders文件夹中创建类:

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);}
}

我们只需要实现该Build()方法,在我们的例子中,它会初始化配置,其中包含我们通过配置源构造函数发送的选项。

这看起来真的很令人困惑,所以让我们看看如何将我们的数据库配置提供程序添加到配置源列表中。我们将以与以前类似的方式进行:

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();}).ConfigureAppConfiguration((hostingContext, configBuilder) =>{var config = configBuilder.Build();var configSource = new EFConfigurationSource(opts =>opts.UseSqlServer(config.GetConnectionString("sqlConnection")));configBuilder.Add(configSource);});

如您所见,我们正在构建配置构建器以获取IConfiguration. 我们需要它,因为我们的连接字符串存储在appsettings.json文件中。现在我们可以使用该连接字符串创建一个配置源,并使用该configBuilder.Add()方法将其添加到现有配置源中。

现在我们要稍微清除一下 appsettings.json 文件:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"ConnectionStrings": {"sqlConnection": "server=.\\SQLEXPRESS; database=CodeMazeCommerce; Integrated Security=true"},"AllowedHosts": "*"
}

我们删除了“页面”部分以确保它是从数据库中读取的。

我们需要删除AddDbContext()我们之前在 Startup 类中使用的方法,因为它不再需要了。

public void ConfigureServices(IServiceCollection services)
{//remove!!!services.AddDbContext<ConfigurationDbContext>(opts =>opts.UseSqlServer(Configuration.GetConnectionString("sqlConnection")));...
}

由于本示例不需要任何迁移,因此请通过 SQL Management Studio 或通过 SQL Server 对象资源管理器手动创建一个名为“CodeMazeCommerce”的数据库。

就是这样,让我们运行应用程序。

运行应用程序

现在,如果我们运行应用程序,在Startup类中放置一个断点,并检查Configuration对象,我们将找到我们的配置源:

如果我们检查数据库,我们会看到它被填充:

让我们继续执行,看看我们的应用程序是否仍然按预期工作:

它仍然像以前一样工作!您可以多次刷新页面以确保标题的颜色仍会发生变化。

结论

在这篇简短的文章中,我们已经了解了如何实现我们自己的自定义配置提供程序来读取数据库中的值。

ASP.NET Core 配置 - 创建自定义配置提供程序相关推荐

  1. 如何在ASP.NET Core中创建自定义AuthorizeAttribute?

    本文翻译自:How do you create a custom AuthorizeAttribute in ASP.NET Core? I'm trying to make a custom aut ...

  2. 在ASP.NET Core中创建自定义端点可视化图

    在上篇文章中,我为构建自定义端点可视化图奠定了基础,正如我在第一篇文章中展示的那样.该图显示了端点路由的不同部分:文字值,参数,动词约束和产生结果的端点: 在本文中,我将展示如何通过创建一个自定义的D ...

  3. 如何在ASP.NET Core中编写自定义日志记录提供程序

    目录 介绍 如何实现所需的接口 基础类和附件 FileLoggerProvider具体类及其附件 1. ConfigureLogging() 2. appsettings.json文件 介绍 源代码可 ...

  4. 【半译】在ASP.NET Core中创建内部使用作用域服务的Quartz.NET宿主服务

    在我的上一篇文章<在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度>,我展示了如何使用ASP.NET Core创建Quartz.NET托管服务并使用它来按计 ...

  5. 2022年8月10日:使用 ASP.NET Core 为初学者构建 Web 应用程序--使用 ASP.NET Core 创建 Web UI(没看懂需要再看一遍)

    ASP.NET Core 支持使用名为 Razor 的本地模板化引擎创建网页. 本模块介绍了如何使用 Razor 和 ASP.NET Core 创建网页. 简介 通过在首选终端中运行以下命令,确保已安 ...

  6. ASP.NET Core中显示自定义错误页面-增强版

    之前的博文 ASP.NET Core中显示自定义错误页面 中的方法是在项目中硬编码实现的,当有多个项目时,就会造成不同项目之间的重复代码,不可取. 在这篇博文中改用middleware实现,并且放在独 ...

  7. 菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计

    配置的热更新 什么是热更新:这个词听着有点熟悉,但到底是什么呢? 一般来说:创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOpti ...

  8. php asp.net core,asp.net core实例教程之配置

    Asp.Net Core-配置Asp.Net Core-配置 在这一章,我们将讨论 ASP.NET Core项目的相关的配置.在解决方案资源管理器中,您将看到 Startup.cs 文件.如果你有以前 ...

  9. Asp.Net Core 项目搭建 基础配置 和MySql 的使用

    一.开发环境准备 1.安装Visual Studio 2015,我这里安装的是专业版. 2.安装.NET Core SDK相关 下载列表:  https://www.microsoft.com/net ...

最新文章

  1. 树形dp ---- 2018年杭电多校第二场 H travel
  2. php session 效率,大量php session临时文件带来的服务器效率问题
  3. (2021) 20 [虚拟化] 进程调度
  4. express 创建ejs项目,使用html
  5. servlet下根据相对路径找资源
  6. Python中.mat文件的读写操作
  7. 机器学习中的矩阵分析与应用
  8. 支持对抗样本防御的AI加速器架构设计
  9. [笔记]Unity粒子特效1初次了解
  10. 超级详细-NMOS、PMOS的工作原理及相关内容整理(下)
  11. 简单点教你python文件处理
  12. 【海外合作】效率源智能手机取证系统入选克罗地亚大学教学工具
  13. api-String
  14. Photoshop给图片替换蓝天白云背景
  15. 时空图神经网络(ST-GNN)
  16. 电脑的网络,一会通一会不通,一般是IP冲突
  17. 二进制数组转成十六进制字符串,以及十六进制字符串转二进制字符串
  18. 项目二 [任务三】使用vim编辑器配置网络 【任务四】root账户密码的破解与保护
  19. 链表操作—单链表的销毁与清空
  20. 机器人D-H矩阵分析(SCARA机器人为例)

热门文章

  1. Domino Web开发规则之二:DOMINO与开发相关的管理规范
  2. nginx+PHP+PHP-FPM(FastCGI)在Ubuntu上的安装和配置
  3. ubuntu安装chrome driver
  4. 极大似然估计与贝叶斯定理
  5. C#隐藏桌面图标和任务栏
  6. 二值图像--形态学处理3 开操作和闭操作
  7. sql语句查询结果合并union 和union all用法
  8. 自定义控件复选框和单选框的实现
  9. NHibernate学习笔记(二):one-to-one关系映射
  10. roku能不能安装软件_如何在Roku中使用Google Assistant