ïŒç§ãã¡ã¯ããªããææã«æ £ããããšããå§ãããŸãèšå®- Metanitã.NETã®ã³ã¢ã§ã©ã®ããã«èšå®äœåã
åé¡ã®å®åŒå
å®è¡æã«JSON圢åŒã§æ§æãæŽæ°ããæ©èœãåããASPNETCoreã¢ããªã±ãŒã·ã§ã³ãå®è£ ããå¿ èŠããããŸããæ§æã®æŽæ°äžãçŸåšå®è¡äžã®ã»ãã·ã§ã³ã¯ã以åã®æ§æãªãã·ã§ã³ã§åŒãç¶ãæ©èœããå¿ èŠããããŸããæ§æãæŽæ°ããåŸã䜿çšãããŠãããªããžã§ã¯ããæŽæ°ããããæ°ãããªããžã§ã¯ãã«çœ®ãæããå¿ èŠããããŸãã
æ§æãéã·ãªã¢ã«åããå¿ èŠããããŸããã³ã³ãããŒã©ãŒããIConfigurationãªããžã§ã¯ãã«çŽæ¥ã¢ã¯ã»ã¹ããŠã¯ãªããŸãããèªã¿åãããå€ãæ£ãããã©ããã確èªããå¿ èŠããããŸããèªã¿åãããŠããªãå Žåã¯ãããã©ã«ãå€ã«çœ®ãæããå¿ èŠããããŸããå®è£ ã¯Dockerã³ã³ããã§æ©èœããã¯ãã§ãã
ã¯ã©ã·ãã¯æ§æäœæ¥
GitHubïŒConfigurationTemplate_1
ãããžã§ã¯ãã¯ãASP NET CoreMVCãã³ãã¬ãŒãã«åºã¥ããŠããŸããJsonConfigurationProvideræ§æãããã€ããŒã¯ãJSONæ§æãã¡ã€ã«ãæäœããããã«äœ¿çšãããŸããæäœäžã«ã¢ããªã±ãŒã·ã§ã³æ§æãåããŒãããæ©èœã远å ããã«ã¯ããã©ã¡ãŒã¿ãŒãreloadOnChangeïŒtrueãã远å ããŸããStartup.cs
ãã¡ã€ã«ã§ã次ã眮ãæããŸãã
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
ãªã³
public Startup(IConfiguration configuration)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
configuration = builder.Build();
Configuration = configuration;
}
.AddJsonFile -JSONãã¡ã€ã«ã远å ããŸããreloadOnChangeïŒtrueã¯ãæ§æãã¡ã€ã«ã®ãã©ã¡ãŒã¿ãŒã倿Žããããšãã«ãã¢ããªã±ãŒã·ã§ã³ããªããŒãããã«ãªããŒããããããšã瀺ããŸããappsettings.json
ãã¡ã€ã«ã®å 容ïŒ
{
"AppSettings": {
"Parameter1": "Parameter1 ABC",
"Parameter2": "Parameter2 ABC"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
ã¢ããªã±ãŒã·ã§ã³ã³ã³ãããŒã©ã¯ãæ§æã«çŽæ¥ã¢ã¯ã»ã¹ãã代ããã«ãServiceABCãšãããµãŒãã¹ã䜿çšããŸããServiceABCã¯ãæ§æãã¡ã€ã«ããåæå€ãååŸããã¯ã©ã¹ã§ãããã®äŸã§ã¯ãServiceABCã¯ã©ã¹ã«å«ãŸããTitleããããã£ã¯1ã€ã ãã§ããServiceABC.cs
ãã¡ã€ã«ã®å 容ïŒ
public class ServiceABC
{
public string Title;
public ServiceABC(string title)
{
Title = title;
}
public ServiceABC()
{ }
}
ServiceABC ã䜿çšããã«ã¯ãServiceABCãããã«ãŠã§ã¢ãµãŒãã¹ãšããŠã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããå¿ èŠããããŸããæ¬¡ã®åŒã䜿çšããŠããµãŒãã¹ã«ã¢ã¯ã»ã¹ãããã³ã«äœæãããAddTransientãšããŠãµãŒãã¹ã远å ããŸãã
services.AddTransient<IYourService>(o => new YourService(param));ã¡ã¢ãªããªãœãŒã¹ãæ¶è²»ããªã軜éãµãŒãã¹ã«æé©ã§ããæ§æãã©ã¡ãŒã¿ãèªã¿åãStartup.csããçšããŠè¡ã£IConfigurationã®AppSettingsïŒäŸãã°å€å Žæã®ãã«ãã¹ã瀺ãã¯ãšãªæååã䜿çšãããã©ã¡ãŒã¿1ãStartup.cs
ãã¡ã€ã«ã«ã次ã远å ããŸãã
public void ConfigureServices(IServiceCollection services)
{
// "Parameter1" ServiceABC
var settingsParameter1 = Configuration["AppSettings:Parameter1"];
// "Parameter1"
services.AddScoped(s=> new ServiceABC(settingsParameter1));
//next
services.AddControllersWithViews();
}
ã³ã³ãããŒã©ã§ServiceABC ãµãŒãã¹ã䜿çšããäŸã§ã¯ãParameter1å€ãhtmlããŒãžã«è¡šç€ºãããŸãã
ã³ã³ãããŒã©ã§ãµãŒãã¹ã䜿çšããã«ã¯ããµãŒãã¹ãã³ã³ã¹ãã©ã¯ã¿ãã¡ã€ã«HomeController.csã«è¿œå ããŸãã
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly ServiceABC _serviceABC;
public HomeController(ILogger<HomeController> logger, ServiceABC serviceABC)
{
_logger = logger;
_serviceABC = serviceABC;
}
public IActionResult Index()
{
return View(_serviceABC);
}
ãµãŒãã¹ã®å¯èŠæ§ã远å ããServiceABCãã¡ã€ã«_ViewImports.cshtml
@using ConfigurationTemplate_1.Services
Index.cshtmlã 倿ŽããŠãããŒãžã«Parameter1ãã©ã¡ãŒã¿ãŒã衚瀺ããŠã¿ãŸãããã
@model ServiceABC
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1> ASP.NET Core</h1>
<h4> </h4>
</div>
<div>
<p> ServiceABC,
Parameter1 = @Model.Title</p>
</div>
ã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸãããïŒ
çµæ
ãã®ã¢ãããŒãã¯éšåçã«åé¡ã解決ããŸãããã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã«æ§æå€æŽãé©çšããããšã¯ã§ããŸããããµãŒãã¹ã¯ãèµ·åæã«ã®ã¿æ§æãã¡ã€ã«ã®å€ãåãåãããã®ã€ã³ã¹ã¿ã³ã¹ã§ã®ã¿æ©èœããŸãããã®çµæãæ§æãã¡ã€ã«ãåŸã§å€æŽããŠããã¢ããªã±ãŒã·ã§ã³ã¯å€æŽãããŸããã
ã·ã³ã°ã«ãã³ãšããŠã®IConfigurationã®äœ¿çš
GitHubïŒConfigurationTemplate_2
2çªç®ã®ãªãã·ã§ã³ã¯ãIConfigurationãïŒã·ã³ã°ã«ãã³ãšããŠïŒãµãŒãã¹ã«é 眮ããããšã§ãããã®çµæãIConfigurationã¯ã³ã³ãããŒã©ãŒããã®ä»ã®ãµãŒãã¹ããåŒã³åºãããšãã§ããŸããAddSingletonã䜿çšããå ŽåããµãŒãã¹ã¯1åäœæãããã¢ããªã±ãŒã·ã§ã³ã䜿çšããå ŽåãåŒã³åºãã¯åãã€ã³ã¹ã¿ã³ã¹ã«éä¿¡ãããŸããã¡ã¢ãªãªãŒã¯ããã«ãã¹ã¬ããã®åé¡ãçºçããå¯èœæ§ãããããããã®æ¹æ³ã¯çްå¿ã®æ³šæãæã£ãŠäœ¿çšããŠãã ãããStartup.cs
ã®åã®äŸã®ã³ãŒããæ°ãããã®ã«çœ®ãæããŸãããã
services.AddSingleton<IConfiguration>(Configuration);IConfigurationãã·ã³ã°ã«ãã³ãšããŠãµãŒãã¹ã«è¿œå ããŸãã
public void ConfigureServices(IServiceCollection services)
{
// IConfiguration
services.AddSingleton<IConfiguration>(Configuration);
// "ServiceABC"
services.AddScoped<ServiceABC>();
//next
services.AddControllersWithViews();
}
IConfigurationãåãå ¥ããããã«ServiceABC ãµãŒãã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã倿ŽããŸã
public class ServiceABC
{
private readonly IConfiguration _configuration;
public string Title => _configuration["AppSettings:Parameter1"];
public ServiceABC(IConfiguration Configuration)
{
_configuration = Configuration;
}
public ServiceABC()
{ }
}
以åã®ããŒãžã§ã³ãšåæ§ã«ããµãŒãã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒã«è¿œå ããåååãžã®ãªã³ã¯ã远å ããŸã
, HomeController.cs
ServiceABC _ViewImports.cshtml:
Index.cshtml Parameter1 .
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly ServiceABC _serviceABC;
public HomeController(ILogger<HomeController> logger, ServiceABC serviceABC)
{
_logger = logger;
_serviceABC = serviceABC;
}
public IActionResult Index()
{
return View(_serviceABC);
}
ServiceABC _ViewImports.cshtml:
@using ConfigurationTemplate_2.Services;
Index.cshtml Parameter1 .
@model ServiceABC
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1> ASP.NET Core</h1>
<h4> IConfiguration Singleton</h4>
</div>
<div>
<p>
ServiceABC,
Parameter1 = @Model.Title
</p>
</div>
ã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸããããAddScopedã䜿çšããŠã³ã³ããã«è¿œå ãããServiceABC
ãµãŒãã¹ã¯ãããŒãžèŠæ±ããšã«ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããããšãæå³ããŸãããã®çµæãServiceABCã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ããã¹ãŠã®httpãªã¯ãšã¹ãã§äœæãããIConfigurationæ§æãåããŒããããappsettings.jsonã®æ°ãã倿Žãé©çšãããŸãã ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã®æäœäžã«ãParameter1ãã©ã¡ãŒã¿ãŒããNEW !!!ãã«å€æŽããå ŽåãParameter1 ABCãã®å Žåãæ¬¡ã«ã¹ã¿ãŒãããŒãžã«ã¢ã¯ã»ã¹ãããšãæ°ãããã©ã¡ãŒã¿ãŒå€ã衚瀺ãããŸããappsettings.json ãã¡ã€ã«ã倿ŽããåŸãããŒãžãæŽæ°ããŸãããã
çµæ
ãã®ã¢ãããŒãã®æ¬ ç¹ã¯ãåãã©ã¡ãŒã¿ãŒãæåã§èªã¿åãããšã§ãããŸãããã©ã¡ãŒã¿æ€èšŒã远å ãããšãappsettings.jsonãã¡ã€ã«ã倿ŽããåŸã§ã¯ãªããServiceABCã䜿çšãããã³ã«ãã§ãã¯ãå®è¡ãããŸããããã¯äžèŠãªã¢ã¯ã·ã§ã³ã§ããæè¯ã®å Žåããã©ã¡ãŒã¿ã¯ããã¡ã€ã«ã倿Žããããã³ã«1åã ãæ€èšŒããå¿ èŠããããŸãã
æ€èšŒãäŒŽãæ§æã®éã·ãªã¢ã«åïŒIOptionsãªãã·ã§ã³ïŒ
GitHubïŒConfigurationTemplate_3
ãªãã·ã§ã³ã«ã€ããŠã¯ãã¡ããã芧ãã ããã
ãã®ãªãã·ã§ã³ã«ãããServiceABCã䜿çšããå¿ èŠããªããªããŸãã代ããã«ãæ§æãã¡ã€ã«ãšClientConfigãªããžã§ã¯ãã®èšå®ãå«ãAppSettingsã¯ã©ã¹ã䜿çšãããŸãã ClientConfigãªããžã§ã¯ãã¯ãæ§æã倿ŽããåŸã«åæåããå¿ èŠããããŸããæ¢è£œã®ãªããžã§ã¯ããã³ã³ãããŒã©ãŒã§äœ¿çšãããŸããClientConfigã¯ãå€éšã·ã¹ãã ãšå¯Ÿè©±ããã¯ã©ã¹ã§ããããã®ã³ãŒãã¯å€æŽã§ããŸãããããªãã ãã®ããŒã¿ãã·ãªã¢ã©ã€ãºããå Žåã®AppSettingsã¯ã©ã¹ãããã®åŸãClientConfig
nullã«ãªããŸãããããã£ãŠãèªã¿åãæ§æã€ãã³ãããµãã¹ã¯ã©ã€ããããã³ãã©ãŒã§ClientConfigãªããžã§ã¯ããåæåããå¿ èŠããããŸãã
ããŒãšå€ã®ãã¢ã®åœ¢åŒã§ã¯ãªããç¹å®ã®ã¯ã©ã¹ã®ãªããžã§ã¯ããšããŠæ§æã転éããã«ã¯ãIOptionsã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŸããããã«ãConfigurationManagerãšã¯å¯Ÿç §çã«ãIOptionsã䜿çšãããšãåã ã®ã»ã¯ã·ã§ã³ãéã·ãªã¢ã«åã§ããŸããClientConfigãªããžã§ã¯ããäœæããã«ã¯ããã¹ãŠã®æ§æãåŠçãããåŸã«å®è¡ãããIPostConfigureOptionsã䜿çšããå¿ èŠããããŸãã IPostConfigureOptionsã¯ãæ§æãèªã¿åããããã³ã«ãæè¿ã§ã¯å®è¡ãããŸããClientConfig.csã
äœæããŸãããïŒ
public class ClientConfig
{
private string _parameter1;
private string _parameter2;
public string Value => _parameter1 + " " + _parameter2;
public ClientConfig(ClientConfigOptions configOptions)
{
_parameter1 = configOptions.Parameter1;
_parameter2 = configOptions.Parameter2;
}
}
ClientConfigOptions ãªããžã§ã¯ãã®åœ¢åŒã§ã³ã³ã¹ãã©ã¯ã¿ãŒãšããŠãã©ã¡ãŒã¿ãŒãåãåããŸãã
public class ClientConfigOptions
{
public string Parameter1;
public string Parameter2;
}
AppSettings èšå®ã¯ã©ã¹ãäœæãããã®äžã«ClientConfigBuildïŒïŒã¡ãœãããå®çŸ©ããŠã¿ãŸããããããã«ãããClientConfigãªããžã§ã¯ããäœæãããŸããAppSettings.cs
ãã¡ã€ã«ïŒ
public class AppSettings
{
public string Parameter1 { get; set; }
public string Parameter2 { get; set; }
public ClientConfig clientConfig;
public void ClientConfigBuild()
{
clientConfig = new ClientConfig(new ClientConfigOptions()
{
Parameter1 = this.Parameter1,
Parameter2 = this.Parameter2
}
);
}
}
æåŸã«åŠçãããæ§æãã³ãã©ãŒãäœæããŸãããããããè¡ãã«ã¯ãIPostConfigureOptionsããç¶æ¿ããå¿ èŠããããŸããæåŸã«åŒã³åºãããPostConfigureã¯ClientConfigBuildïŒïŒãå®è¡ããClientConfigãäœæããŸããConfigureAppSettingsOptions.cs
ãã¡ã€ã«ïŒ
public class ConfigureAppSettingsOptions: IPostConfigureOptions<AppSettings>
{
public ConfigureAppSettingsOptions()
{ }
public void PostConfigure(string name, AppSettings options)
{
options.ClientConfigBuild();
}
}
çŸåšãStartup.csã§ã®ã¿å€æŽãå ããå¿ èŠããããŸãã倿Žã¯ãConfigureServicesïŒIServiceCollectionãµãŒãã¹ïŒé¢æ°ã«ã®ã¿åœ±é¿ããŸãã
ãŸããappsettings.jsonã®AppSettingsã»ã¯ã·ã§ã³ãèªã¿ãŸãããã
// configure strongly typed settings objects
var appSettingsSection = Configuration.GetSection("AppSettings");
services.Configure<AppSettings>(appSettingsSection);
ããã«ããªã¯ãšã¹ãããšã«ãåŸåŠçãåŒã³åºãããšãã§ããããã«AppSettingsã®ã³ããŒãäœæãããŸãã
services.AddScoped(sp => sp.GetService<IOptionsSnapshot<AppSettings>>().Value);
AppSettingsã¯ã©ã¹ã®åŸåŠçããµãŒãã¹ãšããŠè¿œå ããŸãããã
services.AddSingleton<IPostConfigureOptions<AppSettings>, ConfigureAppSettingsOptions>();
Startup.csã« ã³ãŒãã远å
public void ConfigureServices(IServiceCollection services)
{
// configure strongly typed settings objects
var appSettingsSection = Configuration.GetSection("AppSettings");
services.Configure<AppSettings>(appSettingsSection);
services.AddScoped(sp => sp.GetService<IOptionsSnapshot<AppSettings>>().Value);
services.AddSingleton<IPostConfigureOptions<AppSettings>, ConfigureAppSettingsOptions>();
//next
services.AddControllersWithViews();
}
æ§æã«ã¢ã¯ã»ã¹ããã«ã¯ãã³ã³ãããŒã©ãŒããAppSettingsãæ¿å ¥ããã ãã§ååã§ããHomeController.cs
ãã¡ã€ã«ïŒ
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly AppSettings _appSettings;
public HomeController(ILogger<HomeController> logger, AppSettings appSettings)
{
_logger = logger;
_appSettings = appSettings;
}
Index.cshtmlã 倿ŽããŠãlientConfigãªããžã§ã¯ãã®Valueãã©ã¡ãŒã¿ãŒã衚瀺ããŠã¿ãŸãããã
@model AppSettings
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1> ASP.NET Core</h1>
<h4> ( IOptions)</h4>
</div>
<div>
<p>
ClientConfig,
= @Model.clientConfig.Value
</p>
</div>
ã¢ããªã±ãŒã·ã§ã³ãèµ·åã
ãŸãããïŒã¢ããªã±ãŒã·ã§ã³ã®æäœäžã«ãParameter1ãã©ã¡ãŒã¿ãŒããNEW !!!ãã«å€æŽããŸããParameter1 ABC "ããã³Parameter2to " NEW !!! Parameter2 ABC "ã®å Žåãæ¬¡ã«æåã®ããŒãžã«ã¢ã¯ã»ã¹ãããšãæ°ããValueããããã£ã衚瀺ãããŸãã
çµæ
ãã®ã¢ãããŒãã§ã¯ããã©ã¡ãŒã¿ãæåã§ç¹°ãè¿ãããšãªãããã¹ãŠã®æ§æå€ãéã·ãªã¢ã«åã§ããŸããåhttpãªã¯ãšã¹ãã¯ãAppSettingsãšlientConfigã®ç¬èªã®ã€ã³ã¹ã¿ã³ã¹ã§æ©èœããè¡çªã®ç¶æ³ãæé€ããŸããIPostConfigureOptionsã¯ããã¹ãŠã®ãªãã·ã§ã³ãåèªã¿åãããããšãã«æåŸã«å®è¡ãããããšãä¿èšŒããŸãããã®ãœãªã¥ãŒã·ã§ã³ã®æ¬ ç¹ã¯ããªã¯ãšã¹ãããšã«ClientConfigã®ã€ã³ã¹ã¿ã³ã¹ãåžžã«äœæãããããšã§ããããã¯ã次ã®çç±ã§å®çšçã§ã¯ãããŸãããå®éãClientConfigã¯ãæ§æã倿ŽãããåŸã«ã®ã¿åäœæããå¿ èŠããããŸãã
æ€èšŒãäŒŽãæ§æã®éã·ãªã¢ã«åïŒIOptionsã䜿çšããªãïŒ
GitHubïŒIPostConfigureOptionsã 䜿çšããConfigurationTemplate_4
䜿çšã¢ãããŒãã«ãããã¯ã©ã€ã¢ã³ãããèŠæ±ãåä¿¡ãããã³ã«ãªããžã§ã¯ãClientConfigãäœæãããŸããããã¯ååã«åççã§ã¯ãããŸãããåãªã¯ãšã¹ãã¯ãappsettings.jsonæ§æãã¡ã€ã«ã倿Žãããå Žåã«ã®ã¿å€æŽãããåæã®ClientConfigç¶æ ã§æ©èœããŸãããããè¡ãã«ã¯ãIPostConfigureOptionsãç Žæ£ããappsettings.jsonã倿Žããããšãã«ã®ã¿åŒã³åºãããæ§æãã³ãã©ãŒãäœæããŸãããã®çµæãClientConfigã¯1åã ãäœæãããäœææžã¿ã®ClientConfigã€ã³ã¹ã¿ã³ã¹ããªã¯ãšã¹ãããšã«æäŸãããŸããSingletonAppSettings ã¯ã©ã¹ãäœæããŸã
ãªã¯ãšã¹ãããšã«èšå®ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããæ§æïŒã·ã³ã°ã«ãã³ïŒãSingletonAppSettings.cs
ãã¡ã€ã«ïŒ
public class SingletonAppSettings
{
public AppSettings appSettings;
private static readonly Lazy<SingletonAppSettings> lazy = new Lazy<SingletonAppSettings>(() => new SingletonAppSettings());
private SingletonAppSettings()
{ }
public static SingletonAppSettings Instance => lazy.Value;
}
Startup ã¯ã©ã¹ã«æ»ããIServiceCollectionã€ã³ã¿ãŒãã§ã€ã¹ãžã®åç §ã远å ããŸãããã
æ§æåŠçæ¹æ³ã§äœ¿çšãããŸã
public IServiceCollection Services { get; set; }
ConfigureServicesïŒIServiceCollectionãµãŒãã¹ïŒã 倿ŽããŠãIServiceCollectionãžã®åç §ãæž¡ããŸããStartup.cs
ãã¡ã€ã«ïŒ
public void ConfigureServices(IServiceCollection services)
{
Services = services;
// AppSettings
var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
appSettings.ClientConfigBuild();
ã·ã³ã°ã«ãã³æ§æã äœæããŠããµãŒãã¹ã³ã¬ã¯ã·ã§ã³ã«è¿œå ããŸãããã
SingletonAppSettings singletonAppSettings = SingletonAppSettings.Instance;
singletonAppSettings.appSettings = appSettings;
services.AddSingleton(singletonAppSettings);
AppSettings ãªããžã§ã¯ããScopedãšããŠè¿œå ããŸãããããªã¯ãšã¹ãããšã«ãã·ã³ã°ã«ãã³ããã®ã³ããŒãäœæãããŸãã
services.AddScoped(sp => sp.GetService<SingletonAppSettings>().appSettings);
å®å šã«ConfigureServicesïŒIServiceCollectionãµãŒãã¹ïŒïŒ
public void ConfigureServices(IServiceCollection services)
{
Services = services;
// AppSettings
var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
appSettings.ClientConfigBuild();
SingletonAppSettings singletonAppSettings = SingletonAppSettings.Instance;
singletonAppSettings.appSettings = appSettings;
services.AddSingleton(singletonAppSettings);
services.AddScoped(sp => sp.GetService<SingletonAppSettings>().appSettings);
//next
services.AddControllersWithViews();
}
次ã«ãConfigureïŒIApplicationBuilderã¢ããªãIWebHostEnvironment envïŒã«æ§æçšã®ãã³ãã©ãŒã远å ããŸããããŒã¯ã³ã¯ãappsettings.jsonãã¡ã€ã«ã®å€æŽã远跡ããããã«äœ¿çšãããŸããOnChangeã¯ããã¡ã€ã«ã倿Žããããšãã«åŒã³åºããã颿°ã§ããOnChangeïŒïŒæ§æãã³ãã©ãŒïŒ
ChangeToken.OnChange(() => Configuration.GetReloadToken(), onChange);
ãŸããappsettings.jsonãã¡ã€ã«ãèªã¿åããAppSettingsã¯ã©ã¹ãéã·ãªã¢ã«åããŸããæ¬¡ã«ããµãŒãã¹ã³ã¬ã¯ã·ã§ã³ãããAppSettingsãªããžã§ã¯ããæ ŒçŽããã·ã³ã°ã«ãã³ãžã®åç §ãååŸãããããæ°ãããã®ã«çœ®ãæããŸãã
private void onChange()
{
var newAppSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
newAppSettings.ClientConfigBuild();
var serviceAppSettings = Services.BuildServiceProvider().GetService<SingletonAppSettings>();
serviceAppSettings.appSettings = newAppSettings;
Console.WriteLine($"AppSettings has been changed! {DateTime.Now}");
}
HomeControllerã§ã¯ã以åã®ããŒãžã§ã³ïŒConfigurationTemplate_3ïŒãšåæ§ã«ãAppSettingsãžã®ãªã³ã¯ãæ¿å
¥ããŸãã
HomeController.cs:
Index.cshtml Value lientConfig:
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly AppSettings _appSettings;
public HomeController(ILogger<HomeController> logger, AppSettings appSettings)
{
_logger = logger;
_appSettings = appSettings;
}
Index.cshtml Value lientConfig:
@model AppSettings
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1> ASP.NET Core</h1>
<h4> ( IOptions)</h4>
</div>
<div>
<p>
ClientConfig,
= @Model.clientConfig.Value
</p>
</div>
ã¢ããªã±ãŒã·ã§ã³ã
èµ·åããŸãããïŒã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ãšããŠèµ·åã¢ãŒããéžæãããšãã¢ããªã±ãŒã·ã§ã³ãŠã£ã³ããŠã«ãæ§æãã¡ã€ã«å€æŽã€ãã³ãã®ããªã¬ãŒã«é¢ããã¡ãã»ãŒãžã衚瀺ãã
ãŸããæ°ããå€ïŒ
çµæ
ãã®ãªãã·ã§ã³ã¯ãããåªããŠããã®IPostConfigureOptionsãã®ã§ããã¹ãŠã®ãªã¯ãšã¹ãã§ã§ã¯ãªããæ§æãã¡ã€ã«ã倿ŽããåŸã«ã®ã¿ãªããžã§ã¯ãããã«ãã§ããŸãããã®çµæããµãŒããŒã®å¿çæéãççž®ãããŸããããŒã¯ã³ãããªã¬ãŒããããšãããŒã¯ã³ã®ç¶æ ããªã»ãããããŸãã
ããã©ã«ãã®è¿œå ãšæ§æã®æ€èšŒ
GitHubïŒConfigurationTemplate_5
åã®äŸã§ã¯ãappsettings.jsonãã¡ã€ã«ããªãå Žåãã¢ããªã±ãŒã·ã§ã³ã¯äŸå€ãã¹ããŒããã®ã§ãæ§æãã¡ã€ã«ããªãã·ã§ã³ã«ããŠãããã©ã«ãèšå®ã远å ããŸãããããã³ãã¬ãŒãããäœæããããããžã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãVisulaStudioã§å ¬éãããšãappsettings.jsonãã¡ã€ã«ããã¹ãŠã®ãã€ããªãšåããã©ã«ãã«é 眮ããããããDockerã«ãããã€ãããšãã«äžäŸ¿ã§ãããã¡ã€ã«appsettings.jsonãconfig /ã«ç§»åãããŸããïŒ
.AddJsonFile("config/appsettings.json")
appsettings.jsonãªãã§ã¢ããªã±ãŒã·ã§ã³ãèµ·åã§ããããã«ããã«ã¯ãoptiona lãã©ã¡ãŒã¿ãŒãtrueã«å€æŽããŸããããã¯ããã®å Žåãappsettings.jsonã®ååšããªãã·ã§ã³ã§ããããšãæå³ããŸããStartup.cs
ãã¡ã€ã«ïŒ
public Startup(IConfiguration configuration)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("config/appsettings.json", optional: true, reloadOnChange: true);
configuration = builder.Build();
Configuration = configuration;
}
远å ãŸããpublic void ConfigureServicesïŒIServiceCollectionãµãŒãã¹ïŒã®æ§æã®ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã©ã€ã³ã«appsettings.jsonãã¡ã€ã«ã®äžåšãæ±ãå ŽåïŒ
var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>() ?? new AppSettings();
IValidatableObject ã€ã³ã¿ãŒãã§ã€ã¹ã«åºã¥ããŠæ§ææ€èšŒã远å ããŸããããæ§æãã©ã¡ãŒã¿ãŒãæ¬ èœããŠããå Žåã¯ãããã©ã«ãå€ã䜿çšãããŸããIValidatableObject
ããAppSettingsã¯ã©ã¹ãç¶æ¿ããæ¬¡ã®ã¡ãœãããå®è£ ããŸãããã
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
AppSettings.cs ãã¡ã€ã«ïŒ
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
List<ValidationResult> errors = new List<ValidationResult>();
if (string.IsNullOrWhiteSpace(this.Parameter1))
{
errors.Add(new ValidationResult(" Parameter1. " +
" DefaultParameter1 ABC"));
this.Parameter1 = "DefaultParameter1 ABC";
}
if (string.IsNullOrWhiteSpace(this.Parameter2))
{
errors.Add(new ValidationResult(" Parameter2. " +
" DefaultParameter2 ABC"));
this.Parameter2 = "DefaultParameter2 ABC";
}
return errors;
}
Startup ã¯ã©ã¹Startup.cs
ãã¡ã€ã«ããåŒã³åºãããæ§æãã§ãã¯ãåŒã³åºãã¡ãœããã远å ããŸãã
private void ValidateAppSettings(AppSettings appSettings)
{
var resultsValidation = new List<ValidationResult>();
var context = new ValidationContext(appSettings);
if (!Validator.TryValidateObject(appSettings, context, resultsValidation, true))
{
resultsValidation.ForEach(
error => Console.WriteLine($" : {error.ErrorMessage}"));
}
}
ConfigureServicesïŒIServiceCollectionãµãŒãã¹ïŒ ã®æ§ææ€èšŒã¡ãœãããžã®åŒã³åºãã远å ããŸããããappsettings.jsonãã¡ã€ã«ããªãå Žåã¯ãAppSettingsãªããžã§ã¯ããããã©ã«ãå€ã§åæåããå¿ èŠããããŸããStartup.cs
ãã¡ã€ã«ïŒ
var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>() ?? new AppSettings();
ãã©ã¡ãŒã¿ã確èªããŠããŸããããã©ã«ãå€ã䜿çšãããšããã©ã¡ãŒã¿ãŒã瀺ãã¡ãã»ãŒãžãã³ã³ãœãŒã«ã«è¡šç€ºãããŸãã
//Validate
this.ValidateAppSettings(appSettings);
appSettings.ClientConfigBuild();
onChangeïŒïŒ ã§èšå®ãã§ãã¯ã倿ŽããŸããã
private void onChange()
{
var newAppSettings = Configuration.GetSection("AppSettings").Get<AppSettings>() ?? new AppSettings();
//Validate
this.ValidateAppSettings(newAppSettings);
newAppSettings.ClientConfigBuild();
var serviceAppSettings = Services.BuildServiceProvider().GetService<SingletonAppSettings>();
serviceAppSettings.appSettings = newAppSettings;
Console.WriteLine($"AppSettings has been changed! {DateTime.Now}");
}
appsettings.jsonãã¡ã€ã«ããParameter1ããŒãåé€ãããšããã¡ã€ã«ãä¿åããåŸããã©ã¡ãŒã¿ãŒããªãããšã瀺ãã¡ãã»ãŒãžãã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ãŠã£ã³ããŠã«è¡šç€ºãããŸãã
çµæ
config ãã©ã«ããŒå ã®æ§æã®å Žæã®ãã¹ã倿Žããããšã¯è¯ã解決çã§ãã 1ã€ã®ããŒãã«ãã¹ãŠã®ãã¡ã€ã«ãæ··åšãããªãããã«ããŸããconfigãã©ã«ããŒã¯ãæ§æãã¡ã€ã«ãæ ŒçŽããããã«ã®ã¿å®çŸ©ãããŠããŸããæ§æã®æ€èšŒãéããŠã管çè åãã«ã¢ããªã±ãŒã·ã§ã³ãå±éããã³æ§æããã¿ã¹ã¯ãç°¡çŽ åããŸãããæ§æãšã©ãŒã®åºåããã°ã«è¿œå ãããšã誀ã£ããã©ã¡ãŒã¿ãŒãæå®ãããå Žåã管çè ã¯åé¡ã«é¢ããæ£ç¢ºãªæ å ±ãåãåããŸããããã°ã©ããŒãæè¿äŸå€ãæžã蟌ã¿å§ãããšãã§ã¯ãããŸããããåé¡ãçºçããŸãããã
æ§æãæäœããããã®çæ³çãªãªãã·ã§ã³ã¯ãããŸããããã¹ãŠã¯ç®åã®ã¿ã¹ã¯ã«äŸåããåãªãã·ã§ã³ã«ã¯é·æãšçæããããŸãã
ãã¹ãŠã®æ§æãã³ãã¬ãŒãã¯ããããå ¥æã§ããŸãã
æç®ïŒ
- æ£ããASP.NETã³ã¢
- METANIT-æ§æãæ§æã®åºæ¬
- ã·ã³ã°ã«ãã³ãã¶ã€ã³ãã¿ãŒã³CïŒ.netã³ã¢
- .NETã³ã¢ã§ã®æ§æã®åããŒã
- ASP.NET CoreRC2ã§ã®ãã¡ã€ã«å€æŽã«é¢ããå³å¯ã«åæå®ããããªãã·ã§ã³ã®åããŒã
- IOptionsãä»ããASP.NETã³ã¢ã¢ããªã±ãŒã·ã§ã³ã®æ§æ
- METANIT-IOptionsãä»ããŠæ§æãæž¡ã
- IOptionsãä»ããASP.NETã³ã¢ã¢ããªã±ãŒã·ã§ã³ã®æ§æ
- METANIT-ã¢ãã«ã®èªå·±æ€èšŒ