日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時間:2023/12/4 asp.net 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core 配置 - 创建自定义配置提供程序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ASP.NET Core 配置 - 創(chuàng)建自定義配置提供程序

在本文中,我們將創(chuàng)建一個自定義配置提供程序,從數(shù)據(jù)庫讀取我們的配置。我們已經(jīng)了解了默認配置提供程序的工作方式,現(xiàn)在我們將實現(xiàn)我們自己的自定義配置提供程序。

對于自定義配置提供程序,我們將使用 Entity Framework Core,并結(jié)合 SQL Server 數(shù)據(jù)庫。

在這篇文章中,我們將討論:

?初始化 EF Core?實現(xiàn)自定義 EF Core 提供程序?運行應用程序?結(jié)論

首先,讓我們使用數(shù)據(jù)庫優(yōu)先方法升級我們的解決方案以支持 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 執(zhí)行數(shù)據(jù)庫的初始創(chuàng)建和遷移。

我們需要一個包含鍵值配置對的類(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; } }

我們只需要一個DbSet的ConfigurationEntity,這將映射到我們的數(shù)據(jù)庫中的表。

現(xiàn)在我們只需要ConfigureServices()在Startup類中的方法中建立到我們的服務器的連接:

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

當然,您需要將appsettings.json文件中的連接字符串更改為您的數(shù)據(jù)庫。如果您使用的是 SqlExpress,它很可能如下所示:

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

就是這樣,現(xiàn)在我們可以簡單地通過包管理器控制臺添加初始遷移:?PM> Add-Migration InitialSetup

并將該遷移應用于數(shù)據(jù)庫:?Update-Database

現(xiàn)在我們的數(shù)據(jù)庫已創(chuàng)建并準備好用于存儲配置數(shù)據(jù)。

實現(xiàn)自定義 EF Core 提供程序

首先,讓我們在 Models 文件夾中創(chuàng)建一個文件夾 ConfigurationProviders,以便正確地對我們的類進行分組。

之后,我們需要通過繼承ConfigurationProvider類來實際創(chuàng)建一個配置提供者。我們將在ConfigurationProviders文件夾中創(chuàng)建我們自己的提供程序類并將其命名為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;} }

這門課乍一看可能有點嚇人,但其實沒那么嚇人。

構造函數(shù)有一個參數(shù),即委托Action<DbContextOptionsBuilder> optionsAction。稍后我們將使用DbContextOptionsBuilder該類為我們的數(shù)據(jù)庫定義上下文。我們之前定義連接字符串時已經(jīng)完成了。我們公開了上下文選項構建器,以便向我們的自定義提供程序提供該選項。

我們正在重寫該Load()方法,以便ConfigurationEntity使用數(shù)據(jù)庫中的數(shù)據(jù)填充我們的方法,或者如果數(shù)據(jù)庫表為空,則創(chuàng)建一些默認的方法。這里的所有都是它的。

接下來,我們要將我們的配置提供程序注冊為源。為了做到這一點,我們需要實現(xiàn)IConfigurationSource接口。所以讓我們EFConfigurationSource在ConfigurationProviders文件夾中創(chuàng)建類:

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

我們只需要實現(xiàn)該Build()方法,在我們的例子中,它會初始化配置,其中包含我們通過配置源構造函數(shù)發(fā)送的選項。

這看起來真的很令人困惑,所以讓我們看看如何將我們的數(shù)據(jù)庫配置提供程序添加到配置源列表中。我們將以與以前類似的方式進行:

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文件中。現(xiàn)在我們可以使用該連接字符串創(chuàng)建一個配置源,并使用該configBuilder.Add()方法將其添加到現(xiàn)有配置源中。

現(xiàn)在我們要稍微清除一下 appsettings.json 文件:

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

我們刪除了“頁面”部分以確保它是從數(shù)據(jù)庫中讀取的。

我們需要刪除AddDbContext()我們之前在 Startup 類中使用的方法,因為它不再需要了。

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

由于本示例不需要任何遷移,因此請通過 SQL Management Studio 或通過 SQL Server 對象資源管理器手動創(chuàng)建一個名為“CodeMazeCommerce”的數(shù)據(jù)庫。

就是這樣,讓我們運行應用程序。

運行應用程序

現(xiàn)在,如果我們運行應用程序,在Startup類中放置一個斷點,并檢查Configuration對象,我們將找到我們的配置源:

如果我們檢查數(shù)據(jù)庫,我們會看到它被填充:

讓我們繼續(xù)執(zhí)行,看看我們的應用程序是否仍然按預期工作:

它仍然像以前一樣工作!您可以多次刷新頁面以確保標題的顏色仍會發(fā)生變化。

結(jié)論

在這篇簡短的文章中,我們已經(jīng)了解了如何實現(xiàn)我們自己的自定義配置提供程序來讀取數(shù)據(jù)庫中的值。

總結(jié)

以上是生活随笔為你收集整理的ASP.NET Core 配置 - 创建自定义配置提供程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。