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

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对象,我们将找到我们的配置源:

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

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

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

结论

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么你的孩子拼命做题,成绩还总是上不去?

▲ 点击查看以前有句名言&#xff1a;“学好数理化&#xff0c;走遍天下都不怕。”这句话放到现在可能并不一定适用&#xff0c;但是数理化生仍然是在孩子整个学习生涯中&#xff0c;占比分量非常重的学科。然而&#xff0c;对很多孩子而言&#xff0c;学习数理化生却是很枯燥乏…

js请求结果拦截机器_CefSharp请求资源拦截及自定义处理

前言在CefSharp中&#xff0c;我们不仅可以使用Chromium浏览器内核&#xff0c;还可以通过Cef暴露出来的各种Handler来实现我们自己的资源请求处理。什么是资源请求呢&#xff1f;简单来说&#xff0c;就是前端页面在加载的过程中&#xff0c;请求的各种文本&#xff08;js、cs…

ListView

2019独角兽企业重金招聘Python工程师标准>>> ListView总结(多选框ListViiew,动态加载&#xff0c;多线程更新ListView中的进度条) convertView缓存及使用 ListView 更高效的使用 Adapter ListView中convertView和ViewHolder的工作原理 convertView&setTag方…

原来,程序的世界远比我想象的精彩

原来&#xff0c;程序的世界远比我想象的精彩 注&#xff1a;本文转载自http://www.cnblogs.com/dingxue/archive/2008/12/23/1360908.html&#xff0c;作者丁学。文中所有的 Pxx 指得是《Erlang程序设计》一书中的页码&#xff0c;书的信息放在文章最后。人都说无知者无畏&am…

【MSLearn 学习模块】Hi ! ⼀起来学Python

随着大数据、人工智能、物联网的兴起&#xff0c;Python越来越受到大家的关注。不论你是⼀位学生&#xff0c;是一位传统的码农&#xff0c;还是非计算机领域的从业人员都离不开Python。当然大家的角度不⼀样&#xff0c;作为学生是以学为主&#xff0c;码农是以用为主&#xf…

有趣的12张数学原理动图,令人舒心却又伤脑!你看懂几个?

全世界只有3.14 % 的人关注了爆炸吧知识下面的12张数学动图你能看懂几个&#xff0c;反正知识君是都看懂了。1.被简单证明的勾股定理给三角形加上一点厚度。从面积问题&#xff0c;跳转到了具象的体积问题。2.勾股定理的面积证明法Its a long story……慢慢看。3.周长和直径的π…

typora插入代码设置_Typora基本功能介绍

Typora是什么&#xff1f;提起Typora&#xff0c;如果是使用过Markdown的人&#xff0c;应该就不太陌生&#xff0c;Typora 是一款支持实时预览的 Markdown 文本编辑器。它有 OS X、Windows、Linux 三个平台的版本&#xff0c;并且由于仍在测试中&#xff0c;是完全免费的。在T…

【DotNetMLLearn】.NET Core人工智能系列-概述

.NETer大家好&#xff0c;今天为大家送上.NET Core 下如何完成人工智能应用的系列&#xff0c;希望给.NETer进入人工智能领域提供一个指引。.NET Core已经是一个全场景应用的技术栈方案&#xff0c;对于每一个领域都有支持。自从微软在开源发力后&#xff0c;.NET Core的社区能…

fanuc机器人控制柜接线_FANUC涂胶标定参考

FANUC涂胶标定参考1、进入SETUP界面2、选择DISPENCE界面3、选择15 flow rate control,按F2 detail进入4、进入标定界面此画面定义含义如下&#xff1a;(1)为涂胶标定单位,TCPP BEAD WIDTH宽度为基准(2)为 输入理想涂胶宽度,desired flow rate(3)为定义出胶轨迹sample program(一…

硬盘坏道修复白皮书

常识&#xff1a;硬盘坏道分类 - 不同坏道分仔细由于硬盘采用磁介质来存储数据&#xff0c;在经历长时间的使用或者使用不当之后&#xff0c;难免会发生一些问题&#xff0c;也就是我们通常所说的产生“坏道”&#xff0c;当然这种坏道有可能 是软件的错误&#xff0c;也有可能…

糟糕!复工后,最让人担心的问题又又又来了!

▲ 点击查看你复工多久了&#xff1f;当我们在家宅着的时候&#xff0c;一天到晚都想着什么时候才能出去。然而现在公司一通知复工&#xff0c;其实心里还是有点犯怵。先不说通勤了&#xff0c;上班吃饭就有又成为大家绕不开的问题。现在虽然可以在外面点外卖&#xff0c;但说实…

Myeclipse中Tomcat的两种部署方式

一、在Myeclipse软件中部署 1、 在Myeclipse中&#xff0c;创建好工程后&#xff0c;在Myeclipse菜单栏中选择 Windows -> Preferences -> Myeclipse -> Tomcat5&#xff0c;选择"Enable"&#xff1b;Tomact Home Directory要选择你机器上Tomcat所安装的目录…

配置yml_dctc:生成docker-compose.yml配置的工具

有时候&#xff0c;我们需要想知道docker容器的运行参数、环境变量等配置&#xff0c;以便容器以后被删掉之后&#xff0c;可以重新运行起来。特别是在测试环境&#xff0c;有些容器可能就是一个docker run就运行起来了。或者随便找一个目录丢了一个docker-compose.yml运行起来…

Silverlight 2 应用程序部署到任意HTML页面

Silverlight 2 应用程序部署到任意HTML页面&#xff0c;可以采用ActiveX的方法&#xff0c;在页面中放入object标签&#xff0c;设置相应的属性即可。使用 object 元素&#xff0c;可以用与所有受支持浏览器兼容的方式在 HTML 中嵌入和配置 Silverlight 插件。具体可参看&#…

对于“知识”,我们存在哪些误解?

全世界只有3.14 % 的人关注了爆炸吧知识对于不少用户来说&#xff0c;微信已经成为了获取新资讯的重要途径之一。如何保证自己找到「值得看」的内容&#xff1f;每天更新的文章这么多&#xff0c;哪些才值得你看呢&#xff1f;今天就为大家推荐一些颜值与才华并存的好评公众号。…

一个搜索需求搞垮微服务

“编程十几年&#xff0c;我只希望能把技术讲明白而已&#xff0c;当然能帮到各位更是深感荣幸“假如你是一名架构师或者技术领导人&#xff0c;一定要深深的知道&#xff0c;没有完美的技术方案&#xff0c;要不然编程技术早就万佛归一。微服务作为近几年新兴的技术概念&#…

Mybatis批量更新转

Mybatis批量更新 批量操作就不进行赘述了。减少服务器与数据库之间的交互。网上有很多关于批量插入还有批量删除的帖子。但是批量更新却没有详细的解决方案。 实现目标 这里主要讲的是1张table中。根据不同的id值&#xff0c;来update不同的property。 数据表&#xff1a;1张。…

45组超炫数学动图,原来当年我如此牛!

全世界只有3.14 % 的人关注了爆炸吧知识想当年我们在数学的海洋里如饥似渴的遨游&#xff0c;什么公式、字母和图形&#xff0c;接招拆招、扫平了无数数学难题&#xff0c;八面威风&#xff0c;牛的不行不行的&#xff01;&#xff01;&#xff01;下面的45组数学动图&#xff…

这样的书值得你读

本文来自豆瓣网网友评论 1.我正在做一个情报分析系统&#xff0c;是一个决策交易系统的基础。里面的很多东西正是我需要的。我觉得很好 我自己想的话 浪费时间。 2.一位垂直搜索开发人员来信说到&#xff1a;我非常有幸买了你们出的《自己动手写搜索引擎》&#xff0c;谢谢你们…

.NET生态现状:超一半 .NET开发者使用C# 8、.NET Framework使用量减少

文 | 局长出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;JetBrains 上个月发布了 2021 年开发者生态的调查报告&#xff0c;这份报告详细介绍了开发领域的最新趋势&#xff0c;以及有关工具、技术、编程语言和编程世界的其他信息。本文会重点介绍这份报…