巚倧ãªãããžã§ã¯ããã»ã³ãµãŒãã¡ããªãã¯ãã¹ã€ããã®å·šå€§ãªããã«ãããããã¹ãŠãå¿ èŠã«å¿ããŠç°¡åã«æ§æã§ããå Žåããã¹ãŠã®ããã°ã©ããŒã¯èªåèªèº«ãé£è¡æ©ã®ãã€ããããšããŠæ³åããŸããããŸããå°ãªããšãèªåã§ã·ã£ãŒã·ãæåã§æã¡äžããããã«å®è¡ããŠããŸãããã¡ããªãã¯ãšã°ã©ãã¯ã©ã¡ããåªããŠããŸããã仿¥ã¯ãèªç©ºæ©ã®åäœã®ãã©ã¡ãŒã¿ãŒã倿ŽããŠæ§æã§ããåãã¿ã³ãã©ãŒãšãã¿ã³ã«ã€ããŠèª¬æããŸãã
æ§æã®éèŠæ§ãéå°è©äŸ¡ããããšã¯å°é£ã§ãã誰ããã¢ããªã±ãŒã·ã§ã³ãæ§æããéã«ããããã®ã¢ãããŒãã䜿çšããååãšããŠããã«ã€ããŠè€éãªããšã¯äœããããŸããããããã¯æ¬åœã«ããã»ã©åçŽã§ããïŒæ§æã®ãåããšãåŸããèŠãŠã詳现ãçè§£ããããšãææ¡ããŸããã€ãŸããæ©èœãæ°æ©èœãããã³ããããæå€§éã«æŽ»çšããæ¹æ³ã§ãã.NET Coreã§ã®æ§æã«æ £ããŠããªã人ã¯åºæ¬ãåŠã³ãæ £ããŠããäººã¯æ¥åžžæ¥åã§æ°ããã¢ãããŒãã«ã€ããŠèãã䜿çšããããã®ç¥èãåŸãããšãã§ããŸãã
Pre-.NETã³ã¢æ§æ
2002幎ã«.NETFrameworkãå°å ¥ãããXMLã®èªå€§å®£äŒã®æä»£ã ã£ããããMicrosoftã®éçºè ã¯ãã©ãã«ã§ãæã£ãŠãããããšæ±ºå¿ãããã®çµæãXMLæ§æã¯ãŸã çããŠããŸããããŒãã«ã®å é ã«ã¯ããã©ã¡ãŒã¿å€ã®æåå衚çŸãååŸããããã®éçConfigurationManagerã¯ã©ã¹ããããŸããæ§æèªäœã¯æ¬¡ã®ããã«ãªããŸããã
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="Title" value=".NET Configuration evo" />
<add key="MaxPage" value="10" />
</appSettings>
</configuration>
åé¡ã¯è§£æ±ºãããéçºè ã¯INIãã¡ã€ã«ãããåªããŠããããç¬èªã®ç¹æ§ãåããã«ã¹ã¿ãã€ãºãªãã·ã§ã³ãå ¥æããŸããããããã£ãŠãããšãã°ãããŸããŸãªã¿ã€ãã®ã¢ããªã±ãŒã·ã§ã³ç°å¢ã«å¯ŸããããŸããŸãªèšå®å€ã®ãµããŒãã¯ãæ§æãã¡ã€ã«ã®XSLT倿ã䜿çšããŠå®è£ ãããŸããããŒã¿ã®ã°ã«ãŒãåã«é¢ããŠããè€éãªãã®ãå¿ èŠãªå Žåã¯ãèŠçŽ ãšå±æ§ã«å¯ŸããŠç¬èªã®XMLã¹ããŒããå®çŸ©ã§ããŸããããŒãšå€ã®ãã¢ã¯å³å¯ã«æååã¿ã€ãã§ãããæ°å€ãŸãã¯æ¥ä»ãå¿ èŠãªå Žåã¯ããã©ãã«ãããŠèªåã§ããããïŒ
string title = ConfigurationManager.AppSettings["Title"];
int maxPage = int.Parse(ConfigurationManager.AppSettings["MaxPage"]);
2005幎ã«ãæ§æã»ã¯ã·ã§ã³ã远å ããŸããããããã®ã»ã¯ã·ã§ã³ã§ã¯ããã©ã¡ãŒã¿ãŒã®ã°ã«ãŒãåãç¬èªã®ã¹ããŒã ã®æ§ç¯ãååã®ç«¶åã®åé¿ãå¯èœã§ããã * .settingsãã¡ã€ã«ãšãããã®ããã®ç¹å¥ãªãã¶ã€ããŒã玹ä»ããŸããã
ããã§ãæ§æããŒã¿ã衚ããçæãããå³å¯ã«åæå®ãããã¯ã©ã¹ãååŸã§ããŸãããã¶ã€ãã䜿çšãããšãå€ãç°¡åã«ç·šéã§ããŸãããšãã£ã¿ã®åã§äžŠã¹æ¿ããããšãã§ããŸããããŒã¿ã¯ãã·ã³ã°ã«ãã³æ§æãªããžã§ã¯ããæäŸãããçæãããã¯ã©ã¹ã®Defaultããããã£ã䜿çšããŠååŸãããŸãã
DateTime date = Properties.Settings.Default.CustomDate;
int displayItems = Properties.Settings.Default.MaxDisplayItems;
string name = Properties.Settings.Default.ApplicationName;
ãŸããæ§æãã©ã¡ãŒã¿ãŒå€ã®ã¹ã³ãŒãã远å ããŸããããŠãŒã¶ãŒé åã¯ãŠãŒã¶ãŒããŒã¿ãæ åœããŸãããŠãŒã¶ãŒããŒã¿ã¯ãŠãŒã¶ãŒã倿Žããããããã°ã©ã ã®å®è¡äžã«ä¿åãããã§ããŸããä¿åã¯ããã¹ïŒ AppDataïŒ \ *ã¢ããªã±ãŒã·ã§ã³å*ã«æ²¿ã£ãå¥ã®ãã¡ã€ã«ã§è¡ãããŸããã¢ããªã±ãŒã·ã§ã³ã¹ã³ãŒãã䜿çšãããšããŠãŒã¶ãŒãåå®çŸ©ããããšãªããã©ã¡ãŒã¿å€ãååŸã§ããŸãã
åæã«ãããããããå šäœãããè€éã«ãªããŸããã
- å®éããããã¯åãXMLãã¡ã€ã«ã§ããããµã€ãºãæ¥éã«å€§ãããªãå§ãããã®çµæãèªã¿åããäžäŸ¿ã«ãªããŸããã
- æ§æã¯XMLãã¡ã€ã«ãã1åèªã¿åãããæ§æããŒã¿ã«å€æŽãé©çšããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ããªããŒãããå¿ èŠããããŸãã
- * .settingsãã¡ã€ã«ããçæãããã¯ã©ã¹ã¯ãå°å°ããã修食åã§ããŒã¯ãããŠããããããã®ã¯ã©ã¹ãç¶æ¿ã§ããŸããã§ãããããã«ããã®ãã¡ã€ã«ã¯å€æŽãããå¯èœæ§ããããŸãããåçãçºçãããšãèªåã§äœæãããã®ããã¹ãŠå€±ãããŸãã
- ããŒå€ã¹ããŒã ã«åŸã£ãŠã®ã¿ããŒã¿ãåŠçããŸããæ§æãæäœããããã®æ§é åãããã¢ãããŒããååŸããã«ã¯ããããèªåã§è¿œå ã§å®è£ ããå¿ èŠããããŸãã
- ããŒã¿ãœãŒã¹ã¯ãã¡ã€ã«ã®ã¿ã§ãããå€éšãããã€ããŒã¯ãµããŒããããŠããŸããã
- ããã«ã人çèŠå ããããŸãããã©ã€ããŒããã©ã¡ãŒã¿ãããŒãžã§ã³å¶åŸ¡ã·ã¹ãã ã«å ¥ããå ¬éãããŸãã
ãããã®åé¡ã¯ãã¹ãŠã仿¥ãŸã§.NETãã¬ãŒã ã¯ãŒã¯ã«æ®ã£ãŠããŸãã
.NETã³ã¢æ§æ
.NET Coreã§ã¯ãæ§æãåèãããã¹ãŠãæåããäœæããéçãªConfigurationManagerã¯ã©ã¹ãåé€ããŠãã以åãã®åé¡ã®å€ãã解決ããŸãããäœãæ°ãããªã£ãã®ã§ããïŒä»¥åãšåæ§ã«ãæ§æããŒã¿ãçæããæ®µéãšãã®ããŒã¿ãæ¶è²»ããæ®µéã§ãããããæè»ã§ã©ã€ããµã€ã¯ã«ãå»¶é·ãããŸãã
æ§æããŒã¿ã®èšå®ãšå ¥å
ãããã£ãŠãããŒã¿çæã®æ®µéã§ã¯ããã¡ã€ã«ã ãã«éå®ããã®ã§ã¯ãªããå€ãã®ãœãŒã¹ã䜿çšã§ããŸããæ§æã¯ãããŒã¿ãœãŒã¹ã远å ããããã®åºç€ã§ããIConfgurationBuilderãä»ããŠè¡ãããŸããNuGetããã±ãŒãžã¯ãããŸããŸãªã¿ã€ãã®ãœãŒã¹ã§å©çšã§ããŸãã
| ãã©ãŒããã | IConfigurationBuilderã«ãœãŒã¹ã远å ããããã®æ¡åŒµã¡ãœãã | NuGetããã±ãŒãž |
| ãžã§ã€ãœã³ | AddJsonFile | Microsoft.Extensions.Configuration.Json |
| XML | AddXmlFile | Microsoft.Extensions.Configuration.Xml |
| INI | AddIniFile | Microsoft.Extensions.Configuration.Ini |
| ã³ãã³ãã©ã€ã³åŒæ° | AddCommandLine | Microsoft.Extensions.Configuration.CommandLine |
| ç°å¢å€æ° | AddEnvironmentVariables | Microsoft.Extensions.Configuration.EnvironmentVariables |
| ãŠãŒã¶ãŒã·ãŒã¯ã¬ãã | AddUserSecrets | Microsoft.Extensions.Configuration.UserSecrets |
| KeyPerFile | AddKeyPerFile | Microsoft.Extensions.Configuration.KeyPerFile |
| Azure KeyVault | AddAzureKeyVault | Microsoft.Extensions.Configuration.AzureKeyVault |
åãœãŒã¹ã¯æ°ããã¬ã€ã€ãŒãšããŠè¿œå ãããäžèŽããããŒã§ãã©ã¡ãŒã¿ãŒããªãŒããŒã©ã€ãããŸããããã¯ãASP.NET Coreã¢ããªãã³ãã¬ãŒãïŒããŒãžã§ã³3.1ïŒã«ããã©ã«ãã§ä»å±ããŠããProgram.csã®äŸã§ãã
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
{ webBuilder.UseStartup<Startup>(); });
CreateDefaultBuilderã« äž»ãªçŠç¹ãåãããããšæããŸããã¡ãœããå ã§ããœãŒã¹ã®åææ§æãã©ã®ããã«è¡ããããã確èªããŸãã
public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
var builder = new WebHostBuilder();
...
builder.ConfigureAppConfiguration((hostingContext, config) =>
{
IHostingEnvironment env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
if (env.IsDevelopment())
{
Assembly appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
if (appAssembly != null)
{
config.AddUserSecrets(appAssembly, optional: true);
}
}
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})
...
return builder;
}
ãããã£ãŠãæ§æå šäœã®ããŒã¹ã¯appsettings.jsonãã¡ã€ã«ã«ãªããŸããããã«ãç¹å®ã®ç°å¢çšã®ãã¡ã€ã«ãããå Žåããã®ãã¡ã€ã«ã®åªå 床ãé«ããªããããããŒã¹ã®äžèŽããå€ãäžæžããããŸãããããŠãåŸç¶ã®åãœãŒã¹ã«ã€ããŠãåæ§ã§ãã远å ã®é åºã¯æçµå€ã«åœ±é¿ããŸããèŠèŠçã«ã¯ããã¹ãŠã次ã®ããã«
ãªããŸããæ³šæã䜿çšããå Žåã¯ã泚æãã¯ãªã¢ããŠãå¿ èŠãªæ¹æ³ãå®çŸ©ããã ãã§ãã
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
.ConfigureAppConfiguration((context,
builder) =>
{
builder.Sources.Clear();
//
});
åæ§æãœãŒã¹ã«ã¯2ã€ã®éšåããããŸãã
- IConfigurationSourceã®å®è£ ãæ§æå€ã®ãœãŒã¹ãæäŸããŸãã
- IConfigurationProviderã®å®è£ ãå ã®ããŒã¿ãçµæã®ããŒå€ã«å€æããŸãã
ãããã®ã³ã³ããŒãã³ããå®è£ ããããšã«ãããæ§æçšã®ç¬èªã®ããŒã¿ãœãŒã¹ãååŸã§ããŸããããã¯ããšã³ãã£ãã£ãã¬ãŒã ã¯ãŒã¯ãä»ããŠããŒã¿ããŒã¹ãããã©ã¡ãŒã¿ãååŸããæ¹æ³ã®äŸã§ãã
ããŒã¿ã®äœ¿ç𿹿³ãšååŸæ¹æ³
èšå®ãšæ§æããŒã¿ã®å ¥åã§ãã¹ãŠãæç¢ºã«ãªã£ãã®ã§ããã®ããŒã¿ãã©ã®ããã«äœ¿çšãããã䟿å©ã«ååŸããããæ€èšããããšãææ¡ããŸãããããžã§ã¯ããæ§æããããã®æ°ããã¢ãããŒãã¯ãäžè¬çãªJSON圢åŒã«å€§ããªåãããããããŸããããã¯ãããŒã¿æ§é ã®æ§ç¯ãããŒã¿ã®ã°ã«ãŒãåãããã³èªã¿åãå¯èœãªãã¡ã€ã«ã®äœæãåæã«è¡ãããšãã§ãããããé©ãã¹ãããšã§ã¯ãããŸãããããšãã°ãæ¬¡ã®æ§æãã¡ã€ã«ãèŠãŠã¿ãŸãããã
{
"Features" : {
"Dashboard" : {
"Title" : "Default dashboard",
"EnableCurrencyRates" : true
},
"Monitoring" : {
"EnableRPSLog" : false,
"EnableStorageStatistic" : true,
"StartTime": "09:00"
}
}
}
ãã¹ãŠã®ããŒã¿ã¯ãã©ãããªããŒå€ãã£ã¯ã·ã§ããªã圢æããæ§æããŒã¯åå€ã®ãã¡ã€ã«ããŒéå±€å šäœãã圢æãããŸããåæ§ã®æ§é ã«ã¯ã次ã®ããŒã¿ã»ããããããŸãã
| æ©èœïŒããã·ã¥ããŒãïŒã¿ã€ãã« | ããã©ã«ãã®ããã·ã¥ããŒã |
| æ©èœïŒããã·ã¥ããŒãïŒEnableCurrencyRates | true |
| æ©èœïŒç£èŠïŒEnableRPSLog | false |
| æ©èœïŒç£èŠïŒEnableStorageStatistic | true |
| æ©èœïŒç£èŠïŒStartTime | 09:00 |
IConfiguration ãªããžã§ã¯ãã䜿çšããŠå€ãååŸã§ããŸããããšãã°ããã©ã¡ãŒã¿ãååŸããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
string title = Configuration["Features:Dashboard:Title"];
string title1 = Configuration.GetValue<string>("Features:Dashboard:Title");
bool currencyRates = Configuration.GetValue<bool>("Features:Dashboard:EnableCurrencyRates");
bool enableRPSLog = Configuration.GetValue<bool>("Features:Monitoring:EnableRPSLog");
bool enableStorageStatistic = Configuration.GetValue<bool>("Features:Monitoring:EnableStorageStatistic");
TimeSpan startTime = Configuration.GetValue<TimeSpan>("Features:Monitoring:StartTime");
ãããŠãããã¯ãã§ã«ããªãè¯ãã§ããå¿ èŠãªããŒã¿ã¿ã€ãã«ãã£ã¹ããããããŒã¿ãååŸããããã®è¯ãæ¹æ³ããããŸãããã©ããããããç§ãã¡ãæãã»ã©ã¯ãŒã«ã§ã¯ãããŸãããäžèšã®ãããªããŒã¿ãåãåã£ãå Žåãã³ãŒããç¹°ãè¿ãããããŒã®ååãééããããšã«ãªããŸããåã ã®å€ã®ä»£ããã«ãå®å šãªæ§æãªããžã§ã¯ããã¢ã»ã³ãã«ã§ããŸããBindã¡ãœããã䜿çšããŠããŒã¿ããªããžã§ã¯ãã«ãã€ã³ããããšãããã«åœ¹ç«ã¡ãŸããã¯ã©ã¹ãšããŒã¿ã®ååŸã®äŸïŒ
public class MonitoringConfig
{
public bool EnableRPSLog { get; set; }
public bool EnableStorageStatistic { get; set; }
public TimeSpan StartTime { get; set; }
}
var monitorConfiguration = new MonitoringConfig();
Configuration.Bind("Features:Monitoring", monitorConfiguration);
var monitorConfiguration1 = new MonitoringConfig();
IConfigurationSection configurationSection = Configuration.GetSection("Features:Monitoring");
configurationSection.Bind(monitorConfiguration1);
åè ã®å Žåã¯ã»ã¯ã·ã§ã³åã§ãã€ã³ãããåŸè ã®å Žåã¯ã»ã¯ã·ã§ã³ãååŸããŠãã€ã³ãããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ãæ§æã®éšåçãªãã¥ãŒãæäœã§ããŸããããã«ãããæäœããŠããããŒã¿ã»ãããå¶åŸ¡ã§ããŸããã»ã¯ã·ã§ã³ã¯ãæšæºã®æ¡åŒµã¡ãœããã§ã䜿çšãããŸããããšãã°ãæ¥ç¶æååãååŸããã«ã¯ããConnectionStringsãã»ã¯ã·ã§ã³ã䜿çšããŸãã
string connectionString = Configuration.GetConnectionString("Default");
public static string GetConnectionString(this IConfiguration configuration, string name)
{
return configuration?.GetSection("ConnectionStrings")?[name];
}
ãªãã·ã§ã³-åä»ãæ§æãã¥ãŒ
æ§æãªããžã§ã¯ããæåã§äœæããŠããŒã¿ã«ãã€ã³ãããããšã¯å®çšçã§ã¯ãããŸããããOptionsã䜿çšãããšãã圢ã§è§£æ±ºçããããŸãããªãã·ã§ã³ã¯ãæ§æã®å³å¯ã«åæå®ããããã¥ãŒãååŸããããã«äœ¿çšãããŸãããã¥ãŒã¯ã©ã¹ã¯ãå€ãå²ãåœãŠãããã®ãã©ã¡ãŒã¿ãšãããªãã¯ããããã£ã®ãªãã³ã³ã¹ãã©ã¯ã¿ã§ãããªãã¯ã§ããå¿ èŠãããããªããžã§ã¯ãã¯ãªãã¬ã¯ã·ã§ã³ã«ãã£ãŠåããããŸãã詳现ã«ã€ããŠã¯ããœãŒã¹ãã芧ãã ããã
ãªãã·ã§ã³ã®äœ¿çšãéå§ããã«ã¯ãã¯ã©ã¹ã«æåœ±ããã»ã¯ã·ã§ã³ã瀺ãIServiceCollectionã®Configureæ¡åŒµã¡ãœããã䜿çšããŠæ§æã¿ã€ããç»é²ããå¿ èŠããããŸãã
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.Configure<MonitoringConfig>(Configuration.GetSection("Features:Monitoring"));
}
ãã®åŸãIOptionsãIOptionsMonitorãIOptionsSnapshotã€ã³ã¿ãŒãã§ã€ã¹ãžã®äŸåé¢ä¿ãæ¿å ¥ããããšã§æ§æãåãåãããšãã§ããŸãã MonitoringConfigãªããžã§ã¯ãã¯ãValueããããã£ãä»ããŠIOptionsã€ã³ã¿ãŒãã§ã€ã¹ããååŸã§ããŸãã
public class ExampleService
{
private IOptions<MonitoringConfig> _configuration;
public ExampleService(IOptions<MonitoringConfig> configuration)
{
_configuration = configuration;
}
public void Run()
{
TimeSpan timeSpan = _configuration.Value.StartTime; // 09:00
}
}
IOptionsã€ã³ã¿ãŒãã§ã€ã¹ã®æ©èœã¯ãäŸåé¢ä¿ã€ã³ãžã§ã¯ã·ã§ã³ã³ã³ããã§ãæ§æãã·ã³ã°ã«ãã³ã©ã€ããµã€ã¯ã«ã®ãªããžã§ã¯ããšããŠç»é²ãããããšã§ãã Valueããããã£ã«ãã£ãŠåããŠå€ãèŠæ±ããããšããªããžã§ã¯ãã¯ããã®ãªããžã§ã¯ããååšããéãååšããããŒã¿ã§åæåãããŸãã IOptionsã¯ããŒã¿ã®æŽæ°ããµããŒãããŠããŸãããæŽæ°ããµããŒãããããã®IOptionsSnapshotããã³IOptionsMonitorã€ã³ã¿ãŒãã§ã€ã¹ããããŸãã
DIã³ã³ããã®IOptionsSnapshotã¯ãã¹ã³ãŒãä»ãã©ã€ããµã€ã¯ã«ã«ç»é²ãããŸããããã«ãããèŠæ±ã«å¿ããŠãæ°ããã³ã³ããã¹ã³ãŒãã§æ°ããæ§æãªããžã§ã¯ããååŸã§ããŸããããšãã°ã1ã€ã®Webãªã¯ãšã¹ãäžã«åããªããžã§ã¯ããåãåããŸãããæ°ãããªã¯ãšã¹ãã®å ŽåãæŽæ°ãããããŒã¿ãå«ãæ°ãããªããžã§ã¯ããåãåããŸãã
IOptionsMonitorã¯ã·ã³ã°ã«ãã³ãšããŠç»é²ãããŸãããåæ§æãèŠæ±æã«å®éã®ããŒã¿ãšãšãã«åä¿¡ããããšããå¯äžã®éãããããŸããããã«ãIOptionsMonitorã䜿çšãããšãããŒã¿å€æŽã€ãã³ãèªäœã«å¿çããå¿ èŠãããå Žåã«ãæ§æå€æŽã€ãã³ããã³ãã©ãŒãç»é²ã§ããŸãã
public class ExampleService
{
private IOptionsMonitor<MonitoringConfig> _configuration;
public ExampleService(IOptionsMonitor<MonitoringConfig> configuration)
{
_configuration = configuration;
configuration.OnChange(config =>
{
Console.WriteLine(" ");
});
}
public void Run()
{
TimeSpan timeSpan = _configuration.CurrentValue.StartTime; // 09:00
}
}
IOptionsSnapshotãšIOptionsMontitorãååã§ååŸããããšãã§ããŸããããã¯ã1ã€ã®ã¯ã©ã¹ã«å¯Ÿå¿ããè€æ°ã®æ§æã»ã¯ã·ã§ã³ããããç¹å®ã®ã»ã¯ã·ã§ã³ãååŸããå Žåã«å¿ èŠã§ããããšãã°ã次ã®ããŒã¿ããããŸãã
{
"Cache": {
"Main": {
"Type": "global",
"Interval": "10:00"
},
"Partial": {
"Type": "personal",
"Interval": "01:30"
}
}
}
æåœ±ã«äœ¿çšãããã¿ã€ãïŒ
public class CachePolicy
{
public string Type { get; set; }
public TimeSpan Interval { get; set; }
}
ç¹å®ã®ååã§æ§æãç»é²ããŸãã
services.Configure<CachePolicy>("Main", Configuration.GetSection("Cache:Main"));
services.Configure<CachePolicy>("Partial", Configuration.GetSection("Cache:Partial"));
次ã®ããã«å€ãåãåãããšãã§ããŸãïŒ
public class ExampleService
{
public ExampleService(IOptionsSnapshot<CachePolicy> configuration)
{
CachePolicy main = configuration.Get("Main");
TimeSpan mainInterval = main.Interval; // 10:00
CachePolicy partial = configuration.Get("Partial");
TimeSpan partialInterval = partial.Interval; // 01:30
}
}
æ§æã¿ã€ããç»é²ããæ¡åŒµã¡ãœããã®ãœãŒã¹ã³ãŒããèŠããšãããã©ã«ãåãOptions.Defaultã§ãããããã¯ç©ºã®æååã§ããããšãããããŸãããããã£ãŠãæé»çã«ãæ§æã®ååãåžžã«æž¡ããŸãã
public static IServiceCollection Configure<TOptions>(this IServiceCollection services, IConfiguration config) where TOptions : class
=> services.Configure<TOptions>(Options.Options.DefaultName, config);
æ§æã¯ã¯ã©ã¹ã§è¡šãããšãã§ãããããSystem.ComponentModel.DataAnnotationsåå空éã®æ€èšŒå±æ§ã䜿çšããŠããããã£ãããŒã¯ã¢ããããããšã«ããããã©ã¡ãŒã¿ãŒå€ã®æ€èšŒã远å ããããšãã§ããŸããããšãã°ãTypeããããã£ã®å€ãå¿ é ã§ããå¿ èŠãããããšãæå®ããŸãããã ããæ§æãç»é²ãããšãã«ãååãšããŠæ€èšŒãè¡ãå¿ èŠãããããšã瀺ãå¿ èŠããããŸãããã®ããã®æ¡åŒµã¡ãœããValidateDataAnnotationsããããŸãã
public class CachePolicy
{
[Required]
public string Type { get; set; }
public TimeSpan Interval { get; set; }
}
services.AddOptions<CachePolicy>()
.Bind(Configuration.GetSection("Cache:Main"))
.ValidateDataAnnotations();
ãã®ãããªæ€èšŒã®ç¹åŸŽã¯ãæ§æãªããžã§ã¯ããåãåã£ãç¬éã«ã®ã¿çºçããããšã§ããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«æ§æãç¡å¹ã§ããããšãçè§£ããããšãå°é£ã«ãªããŸãããã®åé¡ã«ã€ããŠã¯ãGitHubã«åé¡ããããŸãããã®åé¡ã®1ã€ã®è§£æ±ºçã¯ãASP.NETCoreã§å³å¯ã«åæå®ãããæ§æãªããžã§ã¯ããžã®æ€èšŒã®è¿œå ã®èšäºã«ç€ºãããŠããã¢ãããŒãã§ãã
ãªãã·ã§ã³ã®ãã¡ãªãããšãã®åé¿æ¹æ³
ãªãã·ã§ã³ãä»ããæ§æã«ãæ¬ ç¹ããããŸãã䜿çšããã«ã¯ãäŸåé¢ä¿ã远å ããå¿ èŠããããValue / CurrentValueããããã£ã«ã¢ã¯ã»ã¹ããŠå€ãªããžã§ã¯ããååŸããå¿ èŠããããã³ã«ããªãã·ã§ã³ã©ãããŒãªãã§ã¯ãªãŒã³ãªæ§æãªããžã§ã¯ããååŸããããšã§ãããã¯ãªãŒã³ãªã³ãŒããå®çŸã§ããŸãããã®åé¡ã®æãç°¡åãªè§£æ±ºçã¯ãçŽç²ãªæ§æã¿ã€ãã®äŸåé¢ä¿ã®ã³ã³ãããŒãžã®è¿œå ç»é²ã§ãã
services.Configure<MonitoringConfig>(Configuration.GetSection("Features:Monitoring"));
services.AddScoped<MonitoringConfig>(provider => provider.GetRequiredService<IOptionsSnapshot<MonitoringConfig>>().Value);
解決çã¯ç°¡åã§ããæçµçãªã³ãŒãã«IOptionsã«ã€ããŠèªèãããããšã¯ãããŸããããå¿ èŠã«å¿ããŠè¿œå ã®æ§æã¢ã¯ã·ã§ã³ã®æè»æ§ã倱ããŸãããã®åé¡ã解決ããããã«ããããªããžããã¿ãŒã³ã䜿çšã§ããŸããããã«ããããªããžã§ã¯ããåãåãåã«è¿œå ã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ãã远å ã®ã¬ã€ã€ãŒãååŸã§ããŸãã
ãã®ç®æšãéæããã«ã¯ãçŸåšã®ãµã³ãã«ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããå¿ èŠããããŸããæ§æã¯ã©ã¹ã«ã¯ãã©ã¡ãŒã¿ãŒã®ãªãã³ã³ã¹ãã©ã¯ã¿ãŒã®åœ¢åŒã®å¶éããããããIOptions / IOptionsSnapshot / IOptionsMontitorãªããžã§ã¯ããã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããšã¯ã§ããŸããããã®ãããæ§æã®èªã¿åããæçµçãªãã¬ãŒã³ããŒã·ã§ã³ããåé¢ããŸãã
ããšãã°ãMonitoringConfigã¯ã©ã¹ã®StartTimeããããã£ããæšæºåœ¢åŒã«é©åããªãå€ã09ãã®åã衚ãæåå衚çŸã§æå®ãããšããŸãã
public class MonitoringConfigReader
{
public bool EnableRPSLog { get; set; }
public bool EnableStorageStatistic { get; set; }
public string StartTime { get; set; }
}
public interface IMonitoringConfig
{
bool EnableRPSLog { get; }
bool EnableStorageStatistic { get; }
TimeSpan StartTime { get; }
}
public class MonitoringConfig : IMonitoringConfig
{
public MonitoringConfig(IOptionsMonitor<MonitoringConfigReader> option)
{
MonitoringConfigReader reader = option.Value;
EnableRPSLog = reader.EnableRPSLog;
EnableStorageStatistic = reader.EnableStorageStatistic;
StartTime = GetTimeSpanValue(reader.StartTime);
}
public bool EnableRPSLog { get; }
public bool EnableStorageStatistic { get; }
public TimeSpan StartTime { get; }
private static TimeSpan GetTimeSpanValue(string value) => TimeSpan.ParseExact(value, "mm", CultureInfo.InvariantCulture);
}
ã¯ãªãŒã³ãªæ§æãååŸã§ããããã«ããã«ã¯ãäŸåé¢ä¿ã€ã³ãžã§ã¯ã·ã§ã³ã³ã³ããã«ç»é²ããå¿ èŠããããŸãã
services.Configure<MonitoringConfigReader>(Configuration.GetSection("Features:Monitoring"));
services.AddTransient<IMonitoringConfig, MonitoringConfig>();
ãã®ã¢ãããŒãã«ãããæ§æãªããžã§ã¯ãã圢æããããã®å®å šã«å¥åã®ã©ã€ããµã€ã¯ã«ãäœæã§ããŸããç¬èªã®ããŒã¿æ€èšŒã远å ããããæå·åããã圢åŒã§åãåã£ãå Žåã¯ããŒã¿åŸ©å·åã®æ®µéã远å ã§å®è£ ãããããããšãã§ããŸãã
ããŒã¿ã»ãã¥ãªãã£ã®ç¢ºä¿
éèŠãªæ§æã¿ã¹ã¯ã¯ããŒã¿ã»ãã¥ãªãã£ã§ããããŒã¿ã¯èªã¿ãããã¯ãªã¢ããã¹ãã§ä¿åãããããããã¡ã€ã«æ§æã¯å®å šã§ã¯ãããŸãããå€ãã®å Žåããã¡ã€ã«ã¯ã¢ããªã±ãŒã·ã§ã³ãšåããã£ã¬ã¯ããªã«ãããŸãã誀ã£ãŠãããŒã¿ãåé¡è§£é€ã§ããããŒãžã§ã³å¶åŸ¡ã·ã¹ãã ã«å€ãã³ãããããå¯èœæ§ããããŸãããããããããªãã¯ã³ãŒãã§ãããã©ãããæ³åããŠãã ããïŒç¶æ³ã¯éåžžã«äžè¬çã§ããããããã®ãããªãªãŒã¯ãèŠã€ããããã®æ¢è£œã®ããŒã«ã§ããGitleaksãããããŸããçµ±èšãšé瀺ãããããŒã¿ã®å€æ§æ§ãæäŸããå¥ã®èšäºããããŸãã
å€ãã®å Žåããããžã§ã¯ãã«ã¯ãç°å¢ïŒãªãªãŒã¹/ãããã°ãªã©ïŒããšã«åå¥ã®ãã©ã¡ãŒã¿ãŒãå¿ èŠã§ããããšãã°ããœãªã¥ãŒã·ã§ã³ã®1ã€ãšããŠãç¶ç¶çãªçµ±åãšé ä¿¡ã®ããŒã«ã䜿çšããŠæçµå€ã®çœ®æã䜿çšã§ããŸããããã®ãªãã·ã§ã³ã¯éçºäžã«ããŒã¿ãä¿è·ããŸããããŠãŒã¶ãŒã·ãŒã¯ã¬ããããŒã«ã¯ãéçºè ãä¿è·ããããã«èšèšãããŠããŸãã .NET Core SDKïŒ3.0.100以éïŒã«å«ãŸããŠããŸãããã®ããŒã«ã®äž»ãªååã¯äœã§ããïŒãŸããinitã³ãã³ãã§åäœããããã«ãããžã§ã¯ããåæåããå¿ èŠããããŸãã
dotnet user-secrets init
ãã®ã³ãã³ãã¯ãUserSecretsIdèŠçŽ ã.csprojãããžã§ã¯ããã¡ã€ã«ã«è¿œå ããŸãããã®ãã©ã¡ãŒã¿ãŒã䜿çšãããšãéåžžã®JSONãã¡ã€ã«ãæ ŒçŽãããã©ã€ããŒãã¹ãã¬ãŒãžãååŸã§ããŸããéãã¯ããããžã§ã¯ããã£ã¬ã¯ããªã«ãªããããçŸåšã®ã³ã³ãã¥ãŒã¿ãŒã§ã®ã¿äœ¿çšã§ããããšã§ãã Windowsã®ãã¹ã¯ïŒ APPDATAïŒ \ Microsoft \ UserSecrets \ <user_secrets_id> \ secrets.jsonã§ãããLinuxããã³MacOSã®å Žåã¯ã/ .microsoft / usersecrets / <user_secrets_id> /secrets.jsonã§ãã setã³ãã³ãã䜿çšããŠãäžèšã®äŸã®å€ã远å ã§ããŸãã
dotnet user-secrets set "Features:Monitoring:StartTime" "09:00"
䜿çšå¯èœãªã³ãã³ãã®å®å šãªãªã¹ãã¯ãããã¥ã¡ã³ãã«ãããŸãã
æ¬çªç°å¢ã§ã®ããŒã¿ã»ãã¥ãªãã£ã¯ãAWS Secrets ManagerãAzure Key VaultãHashiCorp VaultãConsulãZooKeeperãªã©ã®å°çšã¹ãã¬ãŒãžã䜿çšããŠæã確å®ã«ãªããŸããäžéšãæ¥ç¶ããã«ã¯ããã§ã«æ¢è£œã®NuGetããã±ãŒãžããããREST APIã«ã¢ã¯ã»ã¹ã§ãããããèªåã§ç°¡åã«å®è£ ã§ãããã®ããããŸãã
çµè«
çŸä»£ã®åé¡ã«ã¯çŸä»£çãªè§£æ±ºçãå¿ èŠã§ããã¢ããªã¹ããåçã€ã³ãã©ã¹ãã©ã¯ãã£ãžã®ç§»è¡ã«äŒŽããæ§æã¢ãããŒãã倿ŽãããŸãããæ§æããŒã¿ã®ãœãŒã¹ã®å Žæãšã¿ã€ãã«é¢ä¿ãªããããŒã¿ã®å€æŽã«è¿ éã«å¯Ÿå¿ããå¿ èŠããããŸããã.NET Coreãšãšãã«ãããããçš®é¡ã®ã¢ããªã±ãŒã·ã§ã³æ§æã·ããªãªãå®è£ ããããã®åªããããŒã«ãå ¥æããŸããã