Pelatihan
Penyusun Konfigurasi untuk ASP.NET
Oleh Stephen Molloy dan Rick Anderson
Penyusun konfigurasi menyediakan mekanisme modern dan tangkas bagi aplikasi ASP.NET untuk mendapatkan nilai konfigurasi dari sumber eksternal.
Penyusun konfigurasi:
- Tersedia di .NET Framework 4.7.1 dan yang lebih baru.
- Berikan mekanisme yang fleksibel untuk membaca nilai konfigurasi.
- Atasi beberapa kebutuhan dasar aplikasi saat mereka pindah ke kontainer dan lingkungan yang berfokus pada cloud.
- Dapat digunakan untuk meningkatkan perlindungan data konfigurasi dengan menggambar dari sumber yang sebelumnya tidak tersedia (misalnya, Azure Key Vault dan variabel lingkungan) dalam sistem konfigurasi .NET.
Skenario umum yang dapat ditangani oleh penyusun konfigurasi adalah menyediakan mekanisme penggantian kunci/nilai dasar untuk bagian konfigurasi yang mengikuti pola kunci/nilai. Konsep .NET Framework dari ConfigurationBuilders tidak terbatas pada bagian atau pola konfigurasi tertentu. Namun, banyak penyusun konfigurasi di Microsoft.Configuration.ConfigurationBuilders
(github, NuGet) bekerja dalam pola kunci/nilai.
Pengaturan berikut berlaku untuk semua penyusun konfigurasi kunci/nilai di Microsoft.Configuration.ConfigurationBuilders
.
Penyusun konfigurasi menggunakan sumber eksternal informasi kunci/nilai untuk mengisi elemen kunci/nilai yang dipilih dari sistem konfigurasi. Secara khusus, bagian <appSettings/>
dan <connectionStrings/>
menerima perlakuan khusus dari penyusun konfigurasi. Penyusun bekerja dalam tiga mode:
Strict
- Mode default. Dalam mode ini, penyusun konfigurasi hanya beroperasi pada bagian konfigurasi kunci/berpusat pada nilai yang terkenal.Strict
mode menghitung setiap kunci di bagian . Jika kunci yang cocok ditemukan di sumber eksternal:- Penyusun konfigurasi menggantikan nilai di bagian konfigurasi yang dihasilkan dengan nilai dari sumber eksternal.
Greedy
- Mode ini terkaitStrict
erat dengan mode. Daripada terbatas pada kunci yang sudah ada dalam konfigurasi asli:- Penyusun konfigurasi menambahkan semua pasangan kunci/nilai dari sumber eksternal ke bagian konfigurasi yang dihasilkan.
Expand
- Beroperasi pada XML mentah sebelum diurai ke dalam objek bagian konfigurasi. Ini dapat dianggap sebagai perluasan token dalam string. Bagian mana pun dari string XML mentah yang cocok dengan pola${token}
adalah kandidat untuk ekspansi token. Jika tidak ada nilai terkait yang ditemukan di sumber eksternal, maka token tidak diubah. Penyusun dalam mode ini tidak terbatas pada bagian<appSettings/>
dan<connectionStrings/>
.
Markup berikut dari web.config memungkinkan EnvironmentConfigBuilder dalam Strict
mode:
<configuration>
<configSections>
<section name="configBuilders"
type="System.Configuration.ConfigurationBuildersSection,
System.Configuration, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
restartOnExternalChanges="false" requirePermission="false" />
</configSections>
<configBuilders>
<builders>
<add name="MyEnvironment"
type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Environment,
Version=1.0.0.0, Culture=neutral" />
</builders>
</configBuilders>
<appSettings configBuilders="MyEnvironment">
<add key="ServiceID" value="ServiceID value from web.config" />
<add key="ServiceKey" value="ServiceKey value from web.config" />
</appSettings>
<connectionStrings configBuilders="MyEnvironment">
<add name="default" connectionString="Data Source=web.config/mydb.db" />
</connectionStrings>
Kode berikut membaca <appSettings/>
dan <connectionStrings/>
ditampilkan dalam file web.config sebelumnya:
using System;
using System.Configuration;
using System.Web.UI;
namespace MyConfigBuilders
{
public partial class About : Page
{
public string ServiceID { get; set; }
public string ServiceKey { get; set; }
public string ConString { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
ServiceID = ConfigurationManager.AppSettings["ServiceID"];
ServiceKey = ConfigurationManager.AppSettings["ServiceKey"];
ConString = ConfigurationManager.ConnectionStrings["default"]
?.ConnectionString;
}
}
}
Kode sebelumnya akan mengatur nilai properti ke:
- Nilai dalam file web.config jika kunci tidak diatur dalam variabel lingkungan.
- Nilai variabel lingkungan, jika diatur.
Misalnya, ServiceID
akan berisi:
- "Nilai ServiceID dari web.config", jika variabel
ServiceID
lingkungan tidak diatur. - Nilai
ServiceID
variabel lingkungan, jika diatur.
Gambar berikut menunjukkan <appSettings/>
kunci/nilai dari kumpulan file web.config sebelumnya di editor lingkungan:
Catatan: Anda mungkin perlu keluar dan memulai ulang Visual Studio untuk melihat perubahan dalam variabel lingkungan.
Awalan kunci dapat menyederhanakan kunci pengaturan karena:
- Konfigurasi .NET Framework kompleks dan berlapis.
- Sumber kunci/nilai eksternal umumnya dasar dan datar secara alami. Misalnya, variabel lingkungan tidak ditumpuk.
Gunakan salah satu pendekatan berikut untuk menyuntikkan dan <appSettings/>
<connectionStrings/>
ke dalam konfigurasi melalui variabel lingkungan:
EnvironmentConfigBuilder
Dengan dalam mode defaultStrict
dan nama kunci yang sesuai dalam file konfigurasi. Kode dan markup sebelumnya mengambil pendekatan ini. Menggunakan pendekatan ini Anda tidak dapat memiliki kunci bernama identik di dan<appSettings/>
<connectionStrings/>
.- Gunakan dua
EnvironmentConfigBuilder
s dalamGreedy
mode dengan awalan yang berbeda danstripPrefix
. Dengan pendekatan ini, aplikasi dapat membaca<appSettings/>
dan<connectionStrings/>
tanpa perlu memperbarui file konfigurasi. Bagian berikutnya, stripPrefix, menunjukkan cara melakukan ini. - Gunakan dua
EnvironmentConfigBuilder
s dalamGreedy
mode dengan awalan yang berbeda. Dengan pendekatan ini, Anda tidak dapat memiliki nama kunci duplikat karena nama kunci harus berbeda dengan awalan. Contohnya:
<configuration>
<configSections>
<section name="configBuilders"
type="System.Configuration.ConfigurationBuildersSection,
System.Configuration, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
restartOnExternalChanges="false" requirePermission="false" />
</configSections>
<configBuilders>
<builders>
<add name="AS_Environment" mode="Greedy" prefix="AppSetting_"
type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Environment" />
<add name="CS_Environment" mode="Greedy" prefix="ConnStr_"
type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Environment" />
</builders>
</configBuilders>
<appSettings configBuilders="AS_Environment">
<add key="AppSetting_ServiceID" value="ServiceID value from web.config" />
<add key="AppSetting_default" value="AppSetting_default value from web.config" />
</appSettings>
<connectionStrings configBuilders="CS_Environment">
<add name="ConnStr_default" connectionString="Data Source=web.config/mydb.db" />
</connectionStrings>
Dengan markup sebelumnya, sumber kunci/nilai datar yang sama dapat digunakan untuk mengisi konfigurasi untuk dua bagian yang berbeda.
Gambar berikut menunjukkan <appSettings/>
kunci/nilai dan <connectionStrings/>
dari kumpulan file web.config sebelumnya di editor lingkungan:
Kode berikut membaca <appSettings/>
kunci/nilai dan <connectionStrings/>
yang terkandung dalam file web.config sebelumnya:
public partial class Contact : Page
{
public string ServiceID { get; set; }
public string AppSetting_default { get; set; }
public string ConString { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
ServiceID = ConfigurationManager.AppSettings["AppSetting_ServiceID"];
AppSetting_default = ConfigurationManager.AppSettings["AppSetting_default"];
ConString = ConfigurationManager.ConnectionStrings["ConnStr_default"]
?.ConnectionString;
}
}
Kode sebelumnya akan mengatur nilai properti ke:
- Nilai dalam file web.config jika kunci tidak diatur dalam variabel lingkungan.
- Nilai variabel lingkungan, jika diatur.
Misalnya, menggunakan file web.config sebelumnya, kunci/nilai di gambar editor lingkungan sebelumnya, dan kode sebelumnya, nilai berikut diatur:
Tombol | Nilai |
---|---|
AppSetting_ServiceID | AppSetting_ServiceID dari variabel env |
AppSetting_default | nilai AppSetting_default dari env |
ConnStr_default | ConnStr_default val dari env |
stripPrefix
: boolean, default ke false
.
Markup XML sebelumnya memisahkan pengaturan aplikasi dari string koneksi tetapi memerlukan semua kunci dalam file web.config untuk menggunakan awalan yang ditentukan. Misalnya, awalan AppSetting
harus ditambahkan ke ServiceID
kunci ("AppSetting_ServiceID"). Dengan stripPrefix
, awalan tidak digunakan dalam file web.config . Awalan diperlukan di sumber penyusun konfigurasi (misalnya, di lingkungan.) Kami mengantisipasi sebagian besar pengembang akan menggunakan stripPrefix
.
Aplikasi biasanya menghapus awalan. Web.config berikut menghapus awalan:
<configuration>
<configSections>
<section name="configBuilders"
type="System.Configuration.ConfigurationBuildersSection,
System.Configuration, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
restartOnExternalChanges="false" requirePermission="false" />
</configSections>
<configBuilders>
<builders>
<add name="AS_Environment" mode="Greedy" prefix="AppSetting_"
stripPrefix="true"
type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Environment,
Version=1.0.0.0, Culture=neutral" />
<add name="CS_Environment" mode="Greedy" prefix="ConnStr_"
stripPrefix="true"
type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Environment,
Version=1.0.0.0, Culture=neutral" />
</builders>
</configBuilders>
<appSettings configBuilders="AS_Environment">
<add key="ServiceID" value="ServiceID value from web.config" />
<add key="default" value="AppSetting_default value from web.config" />
</appSettings>
<connectionStrings configBuilders="CS_Environment">
<add name="default" connectionString="Data Source=web.config/mydb.db" />
</connectionStrings>
Dalam file web.config sebelumnya, default
kunci berada di <appSettings/>
dan <connectionStrings/>
.
Gambar berikut menunjukkan <appSettings/>
kunci/nilai dan <connectionStrings/>
dari kumpulan file web.config sebelumnya di editor lingkungan:
Kode berikut membaca <appSettings/>
kunci/nilai dan <connectionStrings/>
yang terkandung dalam file web.config sebelumnya:
public partial class About2 : Page
{
public string ServiceID { get; set; }
public string AppSetting_default { get; set; }
public string ConString { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
ServiceID = ConfigurationManager.AppSettings["ServiceID"];
AppSetting_default = ConfigurationManager.AppSettings["default"];
ConString = ConfigurationManager.ConnectionStrings["default"]
?.ConnectionString;
}
}
Kode sebelumnya akan mengatur nilai properti ke:
- Nilai dalam file web.config jika kunci tidak diatur dalam variabel lingkungan.
- Nilai variabel lingkungan, jika diatur.
Misalnya, menggunakan file web.config sebelumnya, kunci/nilai di gambar editor lingkungan sebelumnya, dan kode sebelumnya, nilai berikut diatur:
Tombol | Nilai |
---|---|
ServiceID | AppSetting_ServiceID dari variabel env |
Default | nilai AppSetting_default dari env |
Default | ConnStr_default val dari env |
tokenPattern
: String, default ke @"\$\{(\w+)\}"
Perilaku Expand
penyusun mencari XML mentah untuk token yang terlihat seperti ${token}
. Pencarian dilakukan dengan ekspresi @"\$\{(\w+)\}"
reguler default . Kumpulan karakter yang cocok \w
lebih ketat daripada XML dan banyak sumber konfigurasi yang diizinkan. Gunakan tokenPattern
saat lebih banyak karakter daripada @"\$\{(\w+)\}"
yang diperlukan dalam nama token.
tokenPattern
:Tali:
- Memungkinkan pengembang mengubah regex yang digunakan untuk pencocokan token.
- Tidak ada validasi yang dilakukan untuk memastikan itu adalah regex yang terbentuk dengan baik dan tidak berbahaya.
- Ini harus berisi grup penangkapan. Seluruh regex harus cocok dengan seluruh token. Pengambilan pertama harus berupa nama token untuk mencari di sumber konfigurasi.
<add name="Environment"
[mode|prefix|stripPrefix|tokenPattern]
type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Environment" />
- Adalah yang paling sederhana dari penyusun konfigurasi.
- Membaca nilai dari lingkungan.
- Tidak memiliki opsi konfigurasi tambahan.
- Nilai
name
atribut bersifat arbitrer.
Catatan: Di lingkungan kontainer Windows, variabel yang diatur pada run time hanya disuntikkan ke lingkungan proses EntryPoint. Aplikasi yang berjalan sebagai layanan atau proses non-EntryPoint tidak mengambil variabel ini kecuali disuntikkan melalui mekanisme dalam kontainer. Untuk kontainer berbasis ASP.NET IIS/, versi ServiceMonitor.exe saat ini menanganinya hanya di DefaultAppPool. Varian kontainer berbasis Windows lainnya mungkin perlu mengembangkan mekanisme injeksi mereka sendiri untuk proses non-EntryPoint.
Peringatan
Jangan pernah menyimpan kata sandi, string koneksi sensitif, atau data sensitif lainnya dalam kode sumber. Rahasia produksi tidak boleh digunakan untuk pengembangan atau pengujian.
<add name="UserSecrets"
[mode|prefix|stripPrefix|tokenPattern]
(userSecretsId="{secret string, typically a GUID}" | userSecretsFile="~\secrets.file")
[optional="true"]
type="Microsoft.Configuration.ConfigurationBuilders.UserSecretsConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.UserSecrets" />
Di XML sebelumnya, userSecretsFile
jalur dapat menggunakan ~/
atau ~\
. Misalnya, jalur dapat ditulis sebagai userSecretsFile="~/secrets.file
. Lihat kelas ConfigurationBuilders Utils untuk informasi selengkapnya.
Penyusun konfigurasi ini menyediakan fitur yang mirip dengan ASP.NET Core Secret Manager.
UserSecretsConfigBuilder dapat digunakan dalam proyek .NET Framework, tetapi file rahasia harus ditentukan. Atau, Anda dapat menentukan UserSecretsId
properti dalam file proyek dan membuat file rahasia mentah di lokasi yang benar untuk membaca. Untuk menjaga dependensi eksternal keluar dari proyek Anda, file rahasia diformat XML. Pemformatan XML adalah detail implementasi, dan format tidak boleh diandalkan. Jika Anda perlu berbagi file secrets.json dengan proyek .NET Core, pertimbangkan untuk menggunakan SimpleJsonConfigBuilder. SimpleJsonConfigBuilder
Format untuk .NET Core juga harus dianggap sebagai detail implementasi yang dapat berubah.
Atribut konfigurasi untuk UserSecretsConfigBuilder
:
userSecretsId
- Ini adalah metode yang disukai untuk mengidentifikasi file rahasia XML. Ini berfungsi mirip dengan .NET Core, yang menggunakanUserSecretsId
properti proyek untuk menyimpan pengidentifikasi ini. String harus unik, tidak perlu menjadi GUID. Dengan atribut ini,UserSecretsConfigBuilder
tampilan di lokasi lokal terkenal (%APPDATA%\Microsoft\UserSecrets\<UserSecrets Id>\secrets.xml
) untuk file rahasia milik pengidentifikasi ini.userSecretsFile
- Atribut opsional yang menentukan file yang berisi rahasia. Karakter~
dapat digunakan di awal untuk mereferensikan akar aplikasi. Atribut ini atauuserSecretsId
atribut diperlukan. Jika keduanya ditentukan,userSecretsFile
lebih diutamakan.optional
: boolean, nilaitrue
default - Mencegah pengecualian jika file rahasia tidak dapat ditemukan.- Nilai
name
atribut bersifat arbitrer.
File rahasia memiliki format berikut:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<secrets ver="1.0">
<secret name="secret key name" value="secret value" />
</secrets>
</root>
<add name="AzureKeyVault"
[mode|prefix|stripPrefix|tokenPattern]
(vaultName="MyVaultName" |
uri="https:/MyVaultName.vault.azure.net")
[version="secrets version"]
[preloadSecretNames="true"]
type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Azure" />
AzureKeyVaultConfigBuilder membaca nilai yang disimpan di Azure Key Vault.
vaultName
diperlukan (baik nama vault atau URI ke vault). Atribut lain memungkinkan kontrol tentang vault mana yang akan disambungkan, tetapi hanya diperlukan jika aplikasi tidak berjalan di lingkungan yang berfungsi dengan Microsoft.Azure.Services.AppAuthentication
. Pustaka Autentikasi Layanan Azure digunakan untuk secara otomatis mengambil informasi koneksi dari lingkungan eksekusi jika memungkinkan. Anda dapat mengambil alih informasi koneksi secara otomatis dengan memberikan string koneksi.
vaultName
- Diperlukan jikauri
tidak disediakan. Menentukan nama vault di langganan Azure Anda untuk membaca pasangan kunci/nilai.uri
- Menyambungkan ke penyedia Key Vault lainnya dengan nilai yang ditentukanuri
. Jika tidak ditentukan, Azure (vaultName
) adalah penyedia vault.version
- Azure Key Vault menyediakan fitur penerapan versi untuk rahasia. Jikaversion
ditentukan, pembuat hanya mengambil rahasia yang cocok dengan versi ini.preloadSecretNames
- Secara default, penyusun ini mengkueri semua nama kunci di brankas kunci saat diinisialisasi. Untuk mencegah membaca semua nilai kunci, atur atribut ini kefalse
. Mengatur ini untukfalse
membaca rahasia satu per satu. Membaca rahasia satu per satu dapat berguna jika vault memungkinkan akses "Dapatkan" tetapi bukan akses "Daftar". Catatan: Saat menggunakanGreedy
mode,preloadSecretNames
harus (true
default.)
<add name="KeyPerFile"
[mode|prefix|stripPrefix|tokenPattern]
(directoryPath="PathToSourceDirectory")
[ignorePrefix="ignore."]
[keyDelimiter=":"]
[optional="false"]
type="Microsoft.Configuration.ConfigurationBuilders.KeyPerFileConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.KeyPerFile" />
KeyPerFileConfigBuilder adalah penyusun konfigurasi dasar yang menggunakan file direktori sebagai sumber nilai. Nama file adalah kuncinya, dan kontennya adalah nilainya. Penyusun konfigurasi ini dapat berguna saat berjalan di lingkungan kontainer yang diorkestrasi. Sistem seperti Docker Swarm dan Kubernetes menyediakan secrets
kontainer windows yang diorkestrasi dengan cara kunci per file ini.
Detail atribut:
directoryPath
- Wajib. Menentukan jalur untuk mencari nilai. Rahasia Docker untuk Windows disimpan di direktori C:\ProgramData\Docker\secrets secara default.ignorePrefix
- File yang dimulai dengan awalan ini dikecualikan. Default ke "abaikan.".keyDelimiter
- Nilai defaultnya adalahnull
. Jika ditentukan, penyusun konfigurasi melintasi beberapa tingkat direktori, membangun nama kunci dengan pemisah ini. Jika nilai ini adalahnull
, penyusun konfigurasi hanya melihat tingkat atas direktori.optional
- Nilai defaultnya adalahfalse
. Menentukan apakah penyusun konfigurasi harus menyebabkan kesalahan jika direktori sumber tidak ada.
Peringatan
Jangan pernah menyimpan kata sandi, string koneksi sensitif, atau data sensitif lainnya dalam kode sumber. Rahasia produksi tidak boleh digunakan untuk pengembangan atau pengujian.
<add name="SimpleJson"
[mode|prefix|stripPrefix|tokenPattern]
jsonFile="~\config.json"
[optional="true"]
[jsonMode="(Flat|Sectional)"]
type="Microsoft.Configuration.ConfigurationBuilders.SimpleJsonConfigBuilder,
Microsoft.Configuration.ConfigurationBuilders.Json" />
Proyek .NET Core sering menggunakan file JSON untuk konfigurasi. Penyusun SimpleJsonConfigBuilder memungkinkan file .NET Core JSON digunakan dalam .NET Framework. Penyusun konfigurasi ini menyediakan pemetaan dasar dari sumber kunci/nilai datar ke area kunci/nilai tertentu dari konfigurasi .NET Framework. Penyusun konfigurasi ini tidak menyediakan konfigurasi hierarkis. File pencadangan JSON mirip dengan kamus, bukan objek hierarkis yang kompleks. File hierarkis multi-tingkat dapat digunakan. Penyedia flatten
ini adalah kedalaman dengan menambahkan nama properti di setiap tingkat menggunakan :
sebagai pemisah.
Detail atribut:
jsonFile
- Wajib. Menentukan file JSON yang akan dibaca. Karakter~
dapat digunakan di awal untuk mereferensikan akar aplikasi.optional
- Boolean, nilai defaultnya adalahtrue
. Mencegah melemparkan pengecualian jika file JSON tidak dapat ditemukan.jsonMode
-[Flat|Sectional]
.Flat
adalah defaultnya. KetikajsonMode
adalahFlat
, file JSON adalah satu kunci datar/sumber nilai.EnvironmentConfigBuilder
danAzureKeyVaultConfigBuilder
juga merupakan sumber kunci/nilai datar tunggal. Ketika dikonfigurasiSimpleJsonConfigBuilder
dalamSectional
mode:- File JSON secara konseptual dibagi hanya di tingkat atas menjadi beberapa kamus.
- Setiap kamus hanya diterapkan ke bagian konfigurasi yang cocok dengan nama properti tingkat atas yang melekat padanya. Contohnya:
{
"appSettings" : {
"setting1" : "value1",
"setting2" : "value2",
"complex" : {
"setting1" : "complex:value1",
"setting2" : "complex:value2",
}
}
}
Lihat Urutan Eksekusi ConfigurationBuilders di repositori GitHub aspnet/MicrosoftConfigurationBuilders .
Jika penyusun konfigurasi tidak memenuhi kebutuhan Anda, Anda dapat menulis yang kustom. Kelas KeyValueConfigBuilder
dasar menangani mode substitusi dan sebagian besar masalah awalan. Proyek penerapan hanya perlu:
- Warisi dari kelas dasar dan terapkan sumber dasar pasangan kunci/nilai melalui
GetValue
danGetAllValues
: - Tambahkan Microsoft.Configuration.ConfigurationBuilders.Base ke proyek.
using Microsoft.Configuration.ConfigurationBuilders;
using System.Collections.Generic;
public class MyCustomConfigBuilder : KeyValueConfigBuilder
{
public override string GetValue(string key)
{
// Key lookup should be case-insensitive, because most key/value collections in
// .NET Framework config sections are case-insensitive.
return "Value for given key, or null.";
}
public override ICollection<KeyValuePair<string, string>> GetAllValues(string prefix)
{
// Populate the return collection.
return new Dictionary<string, string>() { { "one", "1" }, { "two", "2" } };
}
}
Kelas KeyValueConfigBuilder
dasar menyediakan banyak pekerjaan dan perilaku yang konsisten di seluruh penyusun konfigurasi kunci/nilai.