æè¿ã¯ .NET Core ã®ä»äºãããŠããŸãã
ããŠãASP.NET Core ã䜿ã£ãŠãããšããšããããæ§ææ
å ±ã¿ãããªãã®ã¯ IOptions<TOptions>
ã§åãåã£ãŠããã¿ãããªéãªè©±ãç®ã«ããŸãã
äžå¿ å
¬åŒã®ããã¥ã¡ã³ã ã¯ããã®ã§ãããæ£çŽèªãã§ãããããããªããæè»ãªãã ããŒããªãã»ã©ããŒã¿ãããªæãã«ãªããŸããããªã®ã§ãããã§ã¯ã§ããéãïŒïŒïŒç¶²çŸ
çã«è§£èª¬ããŠã¿ãããšæããŸãã
IOptions<TOptions>
ã£ãŠäœïŒïŒTOptions
ãçŽæ¥æ³šå ¥ããã°ãããããïŒIOptionsSnapshot<TOptions>
ãšããããããã£ãŠããããããªã- ãªãã·ã§ã³ã®åçæŽæ°ã«å¿ èŠãªãã®ã¯ïŒ
IConfiguration
ãšã®é¢ä¿ã¯ïŒ
ãªã©ã説æããŠãããŸãã
ãªãããã®ææžã§ã¯ãDI ã®ä»çµã¿ãšã㊠Microsoft.Extensions.DependencyInjection
ãèšãæãããš ServiceCollection
ã䜿çšãã DIïŒãã¡ãããããã䜿çšãã ASP.NET Core ã Azure WebJob SDK ã Azure FunctionïŒã«é¢ããŠã®ã¿èããŸãããã以å€ã® DI ã®ä»çµã¿ã䜿çšããå Žåã«ã¯åäœãç°ãªãå ŽåããããŸãã
æåã«ãIOptions<TOptions>
ãšã¯äœã§ãã©ããããšãã«äœ¿ãã®ããæ¯ãè¿ãããšæããŸãã
ããèªäœã¯ãããã°ã©ã ã®åäœã決å®ããèšå®æ
å ±ããããã°ã©ã ã®å€ããæå®ã§ããããã«ããããã®ãã¬ãŒã ã¯ãŒã¯ã§ãã
IOptions<TOptions>
ç³»åã䜿ãããšã§ãDIïŒäŸåå
泚å
¥ïŒã®ä»çµã¿ã«ä¹ã£ããã€ã€ãå€éšèšå®ãããŸãæ±ããããã«ãªããŸãã
éã«èšãã°ãïŒMicrosoft.Extensions.DependencyInjection
äºæã®ïŒDI ã«ä¹ã£ããå¿
èŠããªããåã®åäœãå€ããæ
å ±ãæ§ææ
å ±ïŒIConfiguration
ïŒããåãåãå¿
èŠããªãå Žåã¯äžèŠãªãã®ã§ãã
ãŸãã¯ãIOptions<TOptions>
ãåãåãåŽã䜿ãåŽã®ãããããããŸãããããšèšã£ãŠãããã®ãããã®æ
å ±ã¯ãµã³ãã«ã³ãŒããè²ã
ãããŸãããdocs.microsoft.com ãèªãã°ããã®ã§ã¯ãšæãã®ã§ãç°¡åã«ã
ã³ã³ã¹ãã©ã¯ã¿ãŒåŒæ°ãšããŠãIOptions<TOptions>
ãIOptionsSnapshot<TOptions>
ãIOptionsMonitor<TOptions>
ã®ãããããåãåããŸãïŒDI ã³ã³ãããŒããåãåããŸãïŒã
ãããããå®éã®ãªãã·ã§ã³èšå®ïŒTOptions
åã®ãªããžã§ã¯ãã§è¡šãèšå®æ
å ±ã®ã°ã«ãŒãïŒã¯ãValue
ããããã£ã§åãåããŸãã
ãªãã·ã§ã³èšå®ã¯ããã®å Žã§ååŸããŠãã£ãŒã«ããããããã£ã«ä¿åããŠãããããããã¯åŸã§ååŸã§ããããã«ããã IOptions[Snapshot|Monitor]
ããã£ãŒã«ãã«ä¿åããŠãããå¿
èŠãªæã«ãã® Value
ãŸã㯠CurrentValue
ãåŒã¶ããšã§åç
§ããŸãã
TOptions
ã¯ãããäžå®ã®ãŸãšãŸããæã£ãæ§æã®ã°ã«ãŒããè¡šããŠãããIOtions[Snapshot|Monitor]
ããã¯ãã®åäœã§ååŸã§ããŸãããªã®ã§ããã TOptions
ã«å®çŸ©ãããåããããã£ã«ã¯ãããæç¹ã§æå®ãããå€ããŸãšããŠïŒåææã®ãã®ãïŒæ¥ãã¯ãã§ãïŒãã ãããããã®å€ãæ£ããããæŽåæ§ãæã£ãŠããããæ£ãããªãå Žåã«ã©ãæ¯ãèãã®ãã¯ãTOptions
ãŸãã¯ãã®åŒã³åºãå
ã®å®è£
ã«ãã ããããŠããŸãïŒã
ããŠããããã®äœ¿ãåãã«ã€ããŠèããŠãããŸãããã
ç¹ã«èŠä»¶ããªããã° IOptions<TOptions>
ã§åãåããã§ãæ§ããªãã®ã§ãããäžäœäºæã§ãã IOptionsSnapshot<TOptions>
ã§åãåããŸãããã
ãªã¯ãšã¹ãã¹ã³ãŒãã§ã®ææ°ã®æ§ææ
å ±ã®åæ ïŒã§ããå Žåãããããããã詳现ã¯åŸè¿°ïŒãšãååä»ãæ§ææ©èœã䜿ããŸãã
ã©ãããŠãå€æŽãç¡èŠãããå Žåã«ã®ã¿ãååä»ãæ§æãæšãŠãŠ IOptions<TOptions>
ã䜿ãã®ã§ããããšã¯æããŸãã
ãšã¯ãããæ¢åã® IOptions<TOptions>
ã䜿ã£ãã³ãŒããçŽãã»ã©ã®äŸ¡å€ã¯ãªãããªãšæããŸãã
äœè«ã§ãããServiceCollection
ã« DI ããããªããžã§ã¯ãã®å®äœã¯ã©ã¡ãã OptionsManager<TOptions>
ã«ãªããŸãããã ããã€ã³ã¿ãŒãã§ã€ã¹ãç»é²ãããšãã®ã©ã€ããµã€ã¯ã«æå®ãç°ãªã£ãŠããŠãIOptions<TOptions>
ã¯ã·ã³ã°ã«ãã³ãIOptionsSnapshot<TOptions>
ã¯ã¹ã³ãŒãä»ãïŒASP.NET Core ãªããªã¯ãšã¹ãããšã«ã¹ã³ãŒããäœæãããŸãïŒã§ç»é²ãããŸãã
Scopedã§ã»ãããã¿ãŒã³ïŒãªã¯ãšã¹ãéå§æã«ææ°ã®å€ã«æŽæ°ããŠã»ãããã¿ãŒã³ïŒ
IOptionSnapshot<T>
ã䜿ããŸãããããããšãDI ã®ã¹ã³ãŒãããšã«ææ°ã®å€ãæ¥ãŸãããéã«èšãã°ã¹ã³ãŒãïŒASP.NET Core ãªããªã¯ãšã¹ãïŒå
ã§æ¥ãå€ãå€ããããšããããŸããã
ãã ããç¹°ãè¿ãã«ãªããŸãããããããåçãªæ§ææ å ±ã®å€æŽã®ãµããŒãèªäœãéå®çã§ããããšã¯å¿ããªãã§ãã ããïŒãã®ãã¡å¯Ÿå¿ãããããããŸãããïŒã
ãã¹ãŠã HTTP ãªã¯ãšã¹ããåãåã AP ãµãŒããŒäžã§åããšæããªãããšããããšã§ãé·æéå®è¡ãããããã»ã¹ã§ããã€åçã«æ§ææ
å ±ãå€æŽãããããšãããããç¹æ®ïŒïŒïŒãªã±ãŒã¹ãèããŠã¿ãŸãããã
ãã®å Žåãã³ã³ã¹ãã©ã¯ã¿ãŒã§ IOptionsMonitor<TOptions>
ãåãåããããããææ°ã®å€ãã©ãã«ãååŸããããšã«ãªããŸãã
å
·äœçã«ã¯ãååä»ãã§ãªãæ§æããååŸããå Žå㯠CurrentValue
ãååä»ãæ§æïŒããã§ã¯èžã¿èŸŒã¿ãŸããïŒã§ã¯ Get(String name)
ã¡ãœããã§ååŸããŸãã
åºæ¬çã«ã¯æŽåæ§ãåããŠããïŒã¯ãïŒã®åäœã§ãŸãšããŠååŸãããã§ãããããããããã®åŒã³åºãã®çµæãããŒã«ã«å€æ°ã«ä¿åããŠããã®å€ã䜿ã£ãŠåŠçãããã¯ãã§ãïŒéœåºŠ CurrentValue
ãåŒã³åºããšãæ¯åéãå€ãè¿ã£ãŠãããããããŸããã®ã§é¿ããŸãããïŒã
ãªããTOptions
ã®å€ãå€ãã£ãå Žåã«ãŸãšããŠåäœãå€æŽãããå ŽåããããšæããŸãããã®å Žåã¯ãIOtionsMonitor<TOptions>.OnChange(Action<TOptions, String>)
ã¡ãœããçµç±ã§ã€ãã³ããã³ãã©ãŒãç»é²ããŠããããã®ã€ãã³ããã³ãã©ãŒã§åŠçãè¡ããŸãã
ãã©ãããã§ãããããããåçãªæ§ææ å ±ã®å€æŽã®ãµããŒãèªäœãéå®çã§ããããšã¯å¿ããªãã§ãã ããïŒãã®ãã¡å¯Ÿå¿ãããããããŸãããïŒã
次ã«ããã® IOptions<TOptions>
ã®ãªããžã§ã¯ãã®äœãæ¹ã説æããŸãã
ASP.NET Core ã®ããã¥ã¡ã³ãã«ããããã€ã§ããæ§ææ
å ±ãäœããã®æ¹æ³ã§èªã¿èŸŒã¿ïŒããã¯äœãšãã㊠IConfiguration
ãªããžã§ã¯ããååŸãïŒããã®å
容ã TOptions
ã«ãããããããã« DI ã®èšå®ãè¡ããŸãã
åºæ¬çã«ã¯ãIServiceCollection.AddOptions<TOptions>([string name])
æ¡åŒµã¡ãœãããåŒã³åºãã°ããã§ãã
ãããããšãTOptions
ã§æå®ããåã«å¯Ÿãã IOptions<TOptions>
ãIOptionsSnapshot<TOptions>
ãIOptionsMonitor<TOptions>
ãããã«å¿
èŠãªåçš®ãžã§ããªãã¯åã DI ã«ç»é²ãããŸãããããŠããã®æ»ãå€ã§ãã OptionsBuilder<TOptions>
ã«å¯ŸããŠãè¿œå ã®ãªãã·ã§ã³ãèšå®ããŸãã
string name
åŒæ°ã¯ããªãã·ã§ã³ã«å¯ŸããŠä»ããååã§ããæå®ããªããªãŒããŒããŒãã§ã¯ãOptions.DefaultName
ã®å€ïŒç©ºæååïŒãæå®ãããæ¢å®ã®ãªãã·ã§ã³ã®èšå®ã«ãªããŸãããã®ååã¯ãIOptionsSnapshot<TOptions>
ãIOptionsMonitor<TOptions>
ã®Get(string)
ã§æž¡ãååã«ãªããŸãã
ãŸãããããŠãã®å Žåã¯æ§ææ
å ±ãããªãã·ã§ã³ãèªã¿èŸŒã¿ããã§ããããããOptionsBuilder<TOptions>.Bind(IConfiguration config [, Action<BinderOptions> configureBinder])
ãåŒã³åºããŠãæ§ææ
å ±ã«ãã€ã³ãããŸãã
IConfiguration configuration
ã¯ãã€ã³ãå ã®æ§ææ å ±ã§ãããã®åŸè©³ãã説æããŸããAction<BinderOptions> configureBinder
ã¯ãBinderOptions
ã®ã«ã¹ã¿ãã€ãºãè¡ãããªã²ãŒããæž¡ããŸãã- 3.0 æç¹ã§ã¯ã
BindNonPublicProperties
ãtrue
ã«ããŠãpublic
ã§ãªãæžã蟌ã¿å¯èœããããã£ã«å¯Ÿãããã€ã³ããè¡ãããã«å€æŽã§ããŸãã
- 3.0 æç¹ã§ã¯ã
ããã«ãå€ãã®å Žåã¯ãªãã·ã§ã³ã®ããªããŒã·ã§ã³ãè¡ãããã§ããããããOptionsBuilder<TOptions>.ValidateDataAnnotations()
æ¡åŒµã¡ãœãããåŒã³åºããŠãããŒã¿ã¢ãããŒã·ã§ã³å±æ§ããŒã¹ã®ããªããŒã·ã§ã³ãæå¹ã«ããŸãããŸããå±æ§ããŒã¹ã§ã¯è¶³ããªãå Žåã«ã¯ãOptionsBuilder<TOptions>.Validate(Func<TOptions, bool> validation, string failureMessage)
ãåŒã³åºããŠãã«ã¹ã¿ã ã®ããªããŒã·ã§ã³ãå®è£
ã§ããŸãïŒããšãã°ãè€æ°ã®ããããã£ã®æŽåæ§ãåãããå ŽåãšãïŒã
ãªãã·ã§ã³ã®åæåã詳现ã«å¶åŸ¡ãããå Žåã«ã¯ãOptionsBuilder<TOptions>.Configure
ã OptionsBuilder<TOptions>.PostConfigure
ã䜿çšã§ããŸãããããã®ã¡ãœããã§ã¯ãäŸåå
ã®ãµãŒãã¹ãã©ã ãåŒã®åŒæ°ãšããŠåãåãããã«ãã§ããŸãããªããå®è¡é ãšããŠã¯ãïŒæ§ææ
å ±ã®ãã€ã³ããå«ãïŒConfigure
åŠçãPostConfigure
åŠçãValidate
åŠçã®é ã§ãã
ãªããIServiceCollection.AddOptions<TOptions>()
æ¡åŒµã¡ãœããã§ã¯ãå®éã«ã¯ä»¥äžãè¡ããŸãã
IServiceCollection.AddOptions()
ãåŒã³åºãã以äžãç»é²ããŸãããããããªãŒãã³ãžã§ããªãã¯åãšããŠç»é²ããŸããIOptions<>
ã®ã·ã³ã°ã«ãã³ãªå®è£ åãšããŠã®OptionsManager<>
ãIOptionsSnapshot<>
ã®ã¹ã³ãŒãä»ãã®å®è£ åãšããŠã®OptionsManager<>
ãIOptionsMonitor<>
ã®ã·ã³ã°ã«ãã³ãªå®è£ åãšããŠã®OptionsMonitor<>
ãIOptionsFactory<>
ã®éœåºŠçæãªå®è£ åãšããŠã®OptionsFactory<>
ãIOptionsMonitorCache<>
ã®ã·ã³ã°ã«ãã³ãªå®è£ åãšããŠã®OptionsCache<>
ã
OptionsBuilder<TOptions>.Bind()
æ¡åŒµã¡ãœããã§ã¯ãå®éã«ã¯ä»¥äžãè¡ããŸãã
IServiceCollection.Configure<TOptions>()
ãåŒã³åºããŸããããã¯ãå®éã«ã¯ä»¥äžãè¡ããŸããIServiceCollection.AddOptions()
ãåŒã³åºããŸããããããããã¯éåžžAddOptions<TOptions>()
ã§ãã§ã«è¡ãããŠãããããäœãèµ·ãããŸãããIOptionsChangeTokenSource<TOptions>
ãšããŠConfigurationChangeTokenSource<TOptions>
ãã·ã³ã°ã«ãã³ã§ç»é²ããå€æŽéç¥ãè¡ããããã«ããŸããIConfigureOptions<TOptions>
ãšããŠNamedConfigureFromConfigurationOptions<TOptions>
ãã·ã³ã°ã«ãã³ã§ç»é²ããæ§ææ å ±ã®ãã€ã³ããè¡ããããã«ããŸãã
ããã§ãIConfiguration
ã«ã€ããŠè£è¶³ããŠãããšãIConfiguration
ã¯æ§ææ
å ±ã®å¡ãè¡šãã€ã³ã¿ãŒãã§ã€ã¹ã§ãIConfigurationBuilder
ã䜿çšããŠãæ§ã
ãªãœãŒã¹ïŒã€ã³ã¡ã¢ãªã³ã¬ã¯ã·ã§ã³ãç°å¢å€æ°ãã³ãã³ãã©ã€ã³ãJSONãAzure Key Vault ãªã©ïŒããååŸãããŒãžããæ§ææ
å ±ïŒ:
åºåãã®ããŒãæã€ãæååã®ãã£ã¯ã·ã§ããªïŒã§ãã
ãã®æ§ææ
å ±ã¯ãããŒã®éå±€æ§é ãæã£ãŠããïŒãã¡ã€ã«ãã¹ã /
ã \
ã§ãã£ã¬ã¯ããªæ§é ã«åºåãããã®ãšåãïŒãIConfiguration.GetSection(String)
ã§ãµãã»ã¯ã·ã§ã³ãšããŠæ§ææ
å ±ã®äžéšãè¡šã IConfiguration
ãååŸã§ããŸããããšãã°ãlog:level
ãlog:output
ãconnectionString:data
ã® 3 ã€ãæ〠IConfiguration
ãããlog:
ã§å§ãŸããã®ã®ã¿ãæã€æ§ææ
å ±ïŒlog:level
ãš log:output
ã®ã¿ãæã€ïŒã IConfiguration
ãšããŠååŸã§ããŸããå®çšäžã¯ããã®åäœã§ TOptions
ã«ãã€ã³ãããããšãå€ãã¯ãã§ãããã®æ¹ã責åãåå²ãããŠæ¥œã«ãªãã®ã§ã
åäœãã¹ãããããšãã«ã¯ã©ãããŸãããããDI ããŸãããããåäœãã¹ããªã®ã« DI ã³ã³ãããŒãšçµåãããã®åæåã«é·ãæéããããåäœãã¹ãã³ãŒããæžããŠããã¯ããªã®ã«ããã£ãŠããã®ã¯ã³ãŒãã®ãã¹ãã§ã¯ãªã㊠DI ã³ã³ãããšåäœãã¹ããã¬ãŒã ã¯ãŒã¯ã®é£æºæ©èœã«ãªãçŸå®ãšæŠããŸããããããããªããªãããã«ã¡ãããšä»çµã¿ãèããã®ãæªãã¯ãªããããããŸãããããã£ãšç°¡åã«çããŸãããã
ãŸãæãã€ãã®ã¯ãMoq ãªãã®ã¢ãã¯ãã¬ãŒã ã¯ãŒã¯ã§ IOptions<TOptions>
ãªãã®ã¢ãã¯ãäœããšããã®ããããŸããæªããªãã§ããããããã Microsoft.Extensions.Options
ã®æ¢å®ã®å®è£
㯠public
ã«å
¬éãããŠããã®ã§ãçŽ çŽã«ããã䜿ãã®ãæã§ãã以äžã«èª¬æããããã«ãIOptions<TOptions>
ã¯è²¬åãååã«åå²ãããŠããïŒè£ãè¿ãã°åå士ã®é¢ä¿ãçµæ§è€éïŒã®ã§ãæ®éã®ãªããžã§ã¯ããšã㊠IOptions<TOptions>
ã®ã¢ãã¯ãäœæã§ããŸãã
IOptions<TOptions>
ã IOptionsSnapshot<TOptions>
ã®å Žåããã®æ¢å®ã®å®è£
ã§ãã OptionsManager<TOptions>
ãªããžã§ã¯ããäœæããŸããå
·äœçã«ã¯ã以äžã®ããã«ããŸãïŒãã ããã®çšåºŠã§ããã°ãã¢ãã¯ãã¬ãŒã ã¯ãŒã¯ã䜿ã£ãŠãå€ãããªãæ°ãããŸããïŒ
var options =
new OptionsManager<TOptions>(
new OptionsFactory<TOptions>(
new IConfigureOptions<TOptions>[]
{
new ConfigureNamedOptions(
String.Empty, // æ§æã®ååãCurrentValue ã§ååŸããååã®ãªãæ§æã«å¯ŸããŠã¯ç©ºæååãæå®ã
options =>
{
// ããã§ãTOptions ã®åããããã£ã奜ããªããã«èšå®ããã
}
)
},
Enumerable.Empty<IPostConfigureOptions<TOptions>>()
)
);
å°ã ç ©éãªã®ã§ãäžèšã®ãããªãã«ããŒãçšæããŠãããšå¹žãã«ãªããã§ãããïŒãšããããæ¢ãã°ã©ããã«ããããã§ããïŒã
public static class OptionsSnapshot
{
public static IOptionsSnapshot<TOptions> Create<TOptions>(Action<TOptions> initializer)
where TOptions : class, new()
=> new OptionsManager<TOptions>(
new OptionsFactory<TOptions>(
new IConfigureOptions<TOptions>[]
{
new ConfigureNamedOptions(
String.Empty,
initializer
)
},
Enumerable.Empty<IPostConfigureOptions<TOptions>>()
)
);
}
åŒã³åºãåŽã¯ãããªæãã§ãã
var options =
OptionsSnapshot.Create(
c =>
{
c.Foo = ...;
c.Bar = ...;
:
}
)
ããŠãIOptionsMonitor<TOptions>
ã®æ¹ã¯å°ãé¢åã§ããäœãããå€æŽéç¥ããµããŒããã IOptionsMonitor<TOptions>
èªäœãè€éãªã®ã§ãé ãè¿œã£ãŠèª¬æããŸãããã
ããã§ã¯ããã®åŸèª¬æããæ§ææ
å ±ã®åçå€æŽãå«ããŠãã¹ãããããšãåæãšããŸãïŒããã§ãªããã°ãããã IOptionsMonitor<TOptions>
ãå¿
èŠãšããªãã¯ãã§ãïŒããŸãããã®ããã«ã¯ãæ§ææ
å ±ã®åçå€æŽãéç¥ãã IOptionsChangeTokenSource<TOptions>
ãšãããªããžã§ã¯ããå¿
èŠãšãªããŸãããããã¯äœãããçšæã§ãããã®ãšããŸãïŒããšãã°ããã®åŸèª¬æãã ConfigurationChangeTokenSource<TOptions>
ã䜿ããšãïŒã
ããŠãIOptionsChangeTokenSource<TOptions>
åã® changeTokenSource
ãªããžã§ã¯ããçšæã§ãããšããŠã以äžã®ããã« OptionsMonitor<TOptions>
ãäœãã° OK ã§ããOptionsFactory<TOptions>
ãªããžã§ã¯ããäœæããéšåã¯å
ã»ã©ãšåãã§ãIOptionsChangeTokenSource<TOptions>
ãš OptionsChache<TOptions>
ãå¿
èŠãªéšåãç°ãªããŸãã
var optionsMonitor =
new OptionsMonitor<TOptions>(
new OptionsFactory<TOptions>(
new IConfigureOptions<TOptions>[]
{
new ConfigureNamedOptions(
String.Empty, // æ§æã®åå
options =>
{
// ããã§ãTOptions ã®åããããã£ã奜ããªããã«èšå®
}
)
},
Enumerable.Empty<IPostConfigureOptions<TOptions>>()
),
changeTokenSource, // ãããé¢åãªãšãã
new OptionsCache<TOptions>()
);
ãã«ããŒãçšæãããšããããããªæãã§ããããã
public static class OptionsMonitor
{
public static IOptionsMonitor<TOptions> Create<TOptions>(Action<TOptions> initializer, IOptionsChangeTokenSource<TOptions> changeTokenSource)
where TOptions : class, new()
=> new OptionsManager<TOptions>(
new OptionsFactory<TOptions>(
new IConfigureOptions<TOptions>[]
{
new ConfigureNamedOptions(
String.Empty,
initializer
)
},
Enumerable.Empty<IPostConfigureOptions<TOptions>>()
),
changeTokenSource,
new OptionsCache<TOptions>()
);
}
ããŠãIOptionsSnapshot<TOptions>
ãš IOptionsMonitor<TOptions>
ã¯åçãªæ§æå€æŽã®åæ ããµããŒãããŸãããã©ã®ããã«ãªã£ãŠããã®ã§ããããã
ãŸãã¯ãåæãšãªã Microsoft.Extensions.Configuration
ãèŠãŠãããŸãããã
æ£çŽãMicrosoft.Extensions.Configuration
ã«ã€ããŠã¯ Deep Dive into Microsoft Configuration ã詳ããã®ã§ãå§ãã§ãã
ãã€ã³ãã¯ã
- æ§ææ
å ±ã¯ã
:
åºåãã®ããŒãæã€ãæååã®ãã£ã¯ã·ã§ããªã§ããã - ããŒã®å€§æåãšå°æåã¯åºå¥ãããªãã
- æ§æãœãŒã¹ïŒ
IConfigurationSource
ïŒã¯ãå ã®ãœãŒã¹ã®åœ¢åŒïŒãªã¹ããããªãŒæ§é ãªã©ïŒããæååã®ãã£ã¯ã·ã§ããªãèªã¿åã圹å²ãæã€ã- æ§æãœãŒã¹ã¯ã
IConfigurationBuilder
ã®æ¡åŒµã¡ãœããã䜿ã£ãŠæ§æããããã®å ŽåãåŸããè¿œå ãããæ§æãœãŒã¹ã®å€ããå ã«è¿œå ããæ§æãœãŒã¹ã®å€ãäžæžããã圢ã§ããŒãžãããã - Microsoft ãåºããŠããæ§æãœãŒã¹ãšããŠãã€ã³ã¡ã¢ãªã³ã¬ã¯ã·ã§ã³ïŒ
Memory
ïŒãç°å¢å€æ°ïŒEnvironment
ïŒãã³ãã³ãã©ã€ã³ïŒCommandLine
ïŒãXMLïŒXml
ïŒãJSONïŒJson
ïŒãiniïŒIni
ïŒã1 ãã¡ã€ã« 1 ããŒã¿ïŒKeyPerFile
ïŒãAzure Key VaultïŒAzureKeyVault
ïŒããŠãŒã¶ãŒã·ãŒã¯ã¬ããïŒUserSecret
ïŒãããã - åçå€æŽããµããŒãããŠããã®ã¯ãã¡ã€ã«ç³»ïŒXMLãJSONãiniïŒã®ã¿ã
- ãã¡ã€ã«ç³»ã«ã€ããŠã¯ã
IFileProvider
å®è£ ã亀æããããšã§ãã€ã³ã¡ã¢ãªããã®èªã¿èŸŒã¿ãªã©ããµããŒãã§ããã - ç°å¢å€æ°ã®å Žåã*nix ç³»ã§èŠåŽããªãããã«ã
__
ã§åºåãããããŒããµããŒãããããŸããå šãŠã®ç°å¢å€æ°ãèªã¿èŸŒãããšããªãããã察象ã®ãã¬ãã£ãã¯ã¹ãæå®ã§ããã - ã³ãã³ãã©ã€ã³ã®å Žåã
--section:subsection:key
ã¿ããã«ã§ãããæ®éãã³ãã³ãã©ã€ã³ã«:
ã¯å«ããªãã®ã§ãæ§ææ å ±ãšä»ãæ··ããããšã¯ãªãã¯ãããªãã--key=value
ã§ã--key value
ã§ãããããŸããéè€ããå Žåã¯åŸåã¡ã - é
åã®ã€ã³ããã¯ã¹ã¯æ°å€ã®ããŒæ±ããããšãã°ã
{"foo":[{"bar":"boo"}]}
ã¯foo:0:bar
ãšããããŒãšboo
ãšããå€ã«ãªãã
- æ§æãœãŒã¹ã¯ã
TOptions
ã«ãã€ã³ããããšãããGetValue<T>()
ã®ãšãã«ãæ§æã®å€ãTypeConverter
ã«ãã£ãŠå€æããã- æ¥ç¶æååã¯ã
ConnectionString:{åå}
ãããã¡ã¯ãããªããConnectionString:{åå}_ProviderName
ã«ãããã€ããŒåïŒSystem.Data.SqlClient
ãªã©ã®DbProviderFactory
ã«æž¡ãååïŒãå ¥ãããšããããã¡ã¯ããããã - ç°å¢å€æ°çšã®ãœãŒã¹ïŒãšãããã€ããŒïŒã«ã¯ãAzure App Service ãæèããèšå®ãçµã¿èŸŒãŸããŠããã®ã§ãAzure Web App ã®ã¢ããªã±ãŒã·ã§ã³èšå®ãšã·ãŒã ã¬ã¹ã«é£æºã§ããïŒãã®èŸºã
Microsoft.Extensions
ãªã®ã§ãããâŠâŠå人çã«ãAzure åãã®æ©èœããã©ã¬ãã«ã§ãªã圢ã§çµã¿èŸŒãŸããŠããã®ã¯æ°æã¡æªããšæããŸããïŒã- ã«ããŠã PostgreSQL ããªãã£ããããã®ã§ã
Custom
ã«ããŠãèªåã§{åå}_ProviderName
ãã¢ããªã±ãŒã·ã§ã³èšå®ã«å ¥ãããè¯ãæ°ã¯ããŸãããããã€ããŒåãå¿ èŠã£ãŠããšã¯ãæ§ã 㪠RDBMS ããµããŒããããã®ã§ããããããã®åŽåããããããç¶æ³ã§ã{åå}_ProviderName
ã®æ¿å ¥ãšãå¬ãããªãæ°ãã
- ã«ããŠã PostgreSQL ããªãã£ããããã®ã§ã
ããŠãMicrosoft.Extensions.Configuration
ã«ã¯å€æŽéç¥ãèæ
®ãããŠããŸããå
·äœçã«ã¯ãæ§æãœãŒã¹ãè¡šã IConfigurationSource
ãå€æŽãéç¥ããIConfigurationProvider
ããã®éç¥ãåãåã£ãŠãæ§ææ
å ±ã®ãã£ã¯ã·ã§ããªãæŽæ°ãããããäžäœã«éç¥ãããšããä»çµã¿ããConfigurationProvider
æœè±¡ã¯ã©ã¹ã«ãŠå®è£
ãããŠããŸãã
IConfigurationProvider
ã®å®è£ ã¯ããã¢ã«ãªãIConfigurationSource
ããéç¥ãåãåããŸãã- ãªããçŸåšããã®åŠçã¯
FileConfigurationProvider
ããå®è£ ããŠããŸããã
- ãªããçŸåšããã®åŠçã¯
IConfigurationProvider
ã¯ãIConfigurationSource
ããã®éç¥ãåãåããå éšã®ãã£ã¯ã·ã§ããªãæŽæ°ããåèªã¿èŸŒã¿ããŒã¯ã³ã«éç¥ãè¡ããŸããConfigurationRoot
ãªã©ã®IConfigurationProvider
ã®ã³ã³ã·ã¥ãŒããŒã¯ãGetReloadToken()
ããè¿ãããIChangeToken
ã賌èªããŸããConfigurationRoot
ãªã©ã®IConfigurationRoot
å®è£ ã¯ããã®ãããã€ããŒããã®å€æŽéç¥ã«å¯Ÿããå¿çãšããŠãèªèº«ã®GetReloadToken()
ãè¿ãIChangeToken
ã§å€æŽãéç¥ããŸããConfigurationRoot
ãšConfigurationProvider
ã«ããIChangeToken
ã®å®è£ ã¯ConfigurationReloadToken
ã§ãããããã¯CancellationTokenSource
ã䜿ã£ãŠå®è£ ãããŠããŸãã
IOptionsMonitor<TOptions>
ã®ãããªIConfigurationRoot
ã®ã³ã³ã·ã¥ãŒããŒããå€æŽéç¥ã䜿çšããŸãïŒãããŠãIOptionsMonitor<TOptions>.OnChange
ã§ç»é²ãããã€ãã³ããã³ãã©ãŒãå®è¡ãããŸãïŒã
ãªã®ã§ããã®ä»çµã¿ã掻çšããã«ã¯ããããã IConfigurationProvider
ãå®è£
ããå¿
èŠããããŸããå®è£
ã«ã€ããŠã¯ãFileConfigurationProvider
åšãã®å®è£
ã github ã§èŠãã®ãæã£åãæ©ãã§ãããã
ãªããIConfigurationRoot.Reload()
ãåŒã³åºãããšã§ãåæ§æãããã€ããŒããææ°ã®å€ãèªã¿çŽãããšãã§ããŸãïŒãã¡ãããIConfigurationProvider.Load()
ããæ¹ããŠå€ãèªãã§ããå®è£
ã«ãªã£ãŠããããšãšãIConfigurationRoot.Reload()
ããã®ããã«å®è£
ãããŠããããšãåæã§ãïŒã
ãããŠããã®åŸã§åºåºã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ãã IConfiguration
ã§å®£èšããã IConfiguration.GetReloadToken()
ã§è¿ããã IChangeToken
ã«éç¥ãããŸãããã®ããããã¹ããªã©ã§ã¯ãã€ã³ã¡ã¢ãªæ§ææ
å ±ãç·šéããIConfigurationRoot.Realod()
ãåŒã³åºãããšã§ãæ§ææ
å ±ã®åèªã¿èŸŒã¿ããã¹ãã§ããŸãã
ããŠãããã§ãå
ã»ã©èª¬æçç¥ãã IOptionsChangeTokenSource<TOptions>
ã«æ»ããŸãããããã®ãªããžã§ã¯ãã¯ãããååä»ãæ§æãªãã·ã§ã³ã®å€æŽããIOptionsMonitor<TOptions>
ã«æž¡ã圹ç®ãæã¡ãŸãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã® Microsoft.Extensions.Configuration
é£æºçšã®å®è£
ãšããŠãConfigurationChangeTokenSource<TOptions>
ãããããã®ãªããžã§ã¯ã㯠IConfiguration.GetReloadToken()
ã§è¿ãããå€æŽéç¥ã転éããŸãã
ãªã®ã§ãæ§ææ å ±ã䜿ãå Žåã以äžã®ããã«ããŸãã
var configData = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
var config =
new ConfigurationBuilder()
.AddMemory(configData)
.Build();
var changeTokenSource =
new ConfigurationChangeTokenSource<TOptions>(String.Empty, config);
var monitor = OptionsMonitor.Create(onChange, changeTokenSource);
ããŠããããŸã§äœ¿ãæ¹ãèŠãŠããŸããããããã€ãã®çåãçããæ¹ãããã®ã§ã¯ãªãã§ããããã
ç§ãã¡ã¯ãIServiceCollection
ã®æ¡åŒµã¡ãœãã ConfigureOptions<TOptions>()
ãåŒãã ã ãã§ãã
DI ã®ä»çµã¿ã䜿çšããŠãªããžã§ã¯ããçµã¿ããã£ãŠããã®ã¯æ³åã§ããŸãããå
·äœçã«ã©ã®ããã«æ§ææ
å ±ãã IOptions<TOptions>
ïŒããã®é²åç³»ïŒãæ§ç¯ãããæž¡ãããã®ã§ããããã
çåã解決ããã«ã¯ github ã®ãœãŒã¹ã³ãŒããèŠãã®ãæã£åãæ©ããšæããŸããããããŸã§èª¬æããŠããå
容ã®å
šäœåã説æããããšã§ãããçšåºŠãã®å©ãã«ãªãããšæããŸãã®ã§ããããã説æããŸãã
åè¿°ã®ããã«ãæ§ææ
å ±ïŒIConfiguration
ïŒã®å®äœã¯ã³ãã³åºåãã®æååã®ããŒãšãæååå€ã®çµã¿åããã®ãªã¹ãã«ãããŸããã
ããããªããžã§ã¯ãã®åœ¢ã§ååŸã§ããããã«ããã«ã¯ããã€ã³ãã£ã³ã°ïŒbinding
ïŒãå¿
èŠã§ãã
æ§ææ
å ±ã®ãã€ã³ãã£ã³ã°ã¯ãMicrosoft.Extensions.Configuration.ConfigurationBinder
ã«å®çŸ©ãããæ¡åŒµã¡ãœããã«ãã£ãŠè¡ãããŸãã
å®è£
èªäœã¯ã·ã³ãã«ã«ãªãã¬ã¯ã·ã§ã³ã䜿çšããå€ã®èšå®ã§ãèšå®å
ã®ããããã£ã®åãã³ã¬ã¯ã·ã§ã³ã§ãã¡ãããšãã€ã³ããããŸãã
ããšãã°ãIDictionary<string, string>
ã«ãã€ã³ãããããšãã§ããã®ã§ãç¹å®ã®æ§æã»ã¯ã·ã§ã³ã«åçŽãªããŒãšæååãå®çŸ©ãããªããŠããšãã§ããŸãã
ããŠããã®ãã€ã³ãã£ã³ã°ã¯èª°ã«ãã£ãŠåŒã³åºãããŠããã®ã§ããããã
å
ã»ã©èŠãããã«ãæçµç㪠IOptions<TOptions>
ïŒããã®é²åç³»ïŒã¯ãOptionsManager<TOptions>
ãšããããä¿æãã OptionsFactory<TOptions>
ããããŠãããä¿æãã 1 ã€ä»¥äžã® IConfigureOptions<TOptions>
ã«ãã£ãŠæ§ç¯ã§ããŸãã
ç§ãã¡ã IServiceCollection.Configure<TOptions>(IConfiguration)
æ¡åŒµã¡ãœãããå®è¡ãããæ£ç¢ºã«ã¯ Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure<TOptions>(IServiceCollection, IConfiguration)
éçã¡ãœãããå®è¡ãããšãå
éšçã«ã¯ä»¥äžã®ããã« DI ã³ã³ãããŒã«åãç»é²ãããŸãã
IOtions
ã®æ§ç¯ã«å¿ èŠãªåã®ç»é²ïŒMicrosoft.Extensions.DependencyInjection.OptionsServiceCollectionExtensions.AddOptions(IServiceCollection)
ã«ããïŒã詳ããã¯åŸè¿°ããŸãããããã§OptionsFactory<TOptions>
ãšOptionsManager<TOptions>
ãç»é²ãããŸãã- æ§æå€æŽã賌èªããããã®
IConfigurationChangeTokenSource<TOptions>
ã®å®è£ ãšããŠãã·ã³ã°ã«ãã³ãªConfigurationChangeTokenSource<TOptions>
ãªããžã§ã¯ããç»é²ããã IConfigureOptions<TOptions>
ã®å®è£ ãšããŠãã·ã³ã°ã«ãã³ãªNamedConfigureFromConfigurationOptions<TOptions>
ãç»é²ããã
ãå¯ãã®ããã«ããã® NamedConfigureFromConfigurationOptions<TOptions>
ã ConfigurationBinder
ã®ã¡ãœãããåŒã³åºããŠãIConfiguration
ã TOptions
ã«ãã€ã³ãããŸãã
ããŠãOptionsServiceCollectionExtensions.AddOptions(IServiceCollection)
ãç»é²ããåã«ã€ããŠã觊ããŠãããŸãããã
ãããã Microsoft.Extensions.Options
ã®å®äœã§ãããšãã£ãŠå·®ãæ¯ããªãã§ãããã
ãŸãããµãŒãã¹åã«ã€ããŠèŠãŠè¡ããŸããAddOptions()
ã§ç»é²ãããåã¯æ¬¡ã® 5 ã€ã§ãã
IOptions<TOptions>
ãå€åã.NET Core 1.0 ãããããæ§ææ å ±ããã€ã³ãããããªããžã§ã¯ããä¿æããåçŽãªåã§ããå®è£ åãïŒãžã§ããªãã¯åãšããŠïŒã·ã³ã°ã«ãã³ãšããŠç»é²ããããããäžåºŠåæåããããšãåžžã«åãå€ãè¿ã£ãŠããã¯ãã§ããIOptionsSnapshot<TOptions>
ã.NET Core 1.1 ããè¿œå ãããŸããããã¡ãã¯ã·ã³ã°ã«ãã³ã§ã¯ãªãã¹ã³ãŒãä»ãïŒscopedïŒãªã®ã§ããªã¯ãšã¹ãããšã«ãªããžã§ã¯ããåæåãããŸãããã®ãããæ§ææ å ±ã®åèªã¿èŸŒã¿ã«å¯Ÿå¿ããŠããã°ããªã¯ãšã¹ãã®åä»æã®ææ°ã®æ å ±ãåæ ãããŠããã¯ãã§ããããã«ãååä»ãæ§æããµããŒãããŠããŸãïŒååä»ãæ§æã«ã€ããŠã¯ä»åã¯è©³çŽ°ã«è§ŠããŸããããEnvironment
ã®å€ãDevelopment
ãStaging
ãProduction
ãããã®ç¶æ ãªã®ãã«å¿ããŠæ§ææ å ±ã®ã»ãããå€ããæ©èœã§ãïŒãIOptionsMonitor<TOptions>
ãIOptionsSnapshot<TOptions>
ãæ¡åŒµãããã®ã§ãå€æŽéç¥ããµããŒãããŸããããããããŒã¢ã³ãªã©ã®å®è£ ãASP.NET Core ã§ããã°IHostedService
ã§æ§ææ å ±ãåãåãã®ã«åããŠããã§ããããIOptionsFactory<TOptions>
ãå®éã«TOptions
ãã€ã³ã¹ã¿ã³ã¹åããŠåæåãã圹å²ãæã¡ãŸããIOptionsMonitorCache<TOptions>
ãIOptionsMonitor<TOptions>
çšã®ããã€ã³ãæžã¿TOptions
ã®ãã£ãã·ã¥ãååä»ãæ§æããµããŒãããŸãã
ãŸããããããã®å®è£ åã«ã€ããŠãèŠãŠè¡ããŸãããã
IOptions<TOptions>
ãšIOptionsSnapshot<TOptions>
ã®å®äœã¯ãã©ã¡ããOptionsManager<TOptions>
ãªããžã§ã¯ãã§ããOptionsManager<TOptions>
ã¯ãIOptionsFactory<TOptions>
ã DI ã§åãåããããããååŸããçµæããã£ãã·ã¥ããValue
ããããã£ãGet()
ã¡ãœããåŒã³åºãã«å¯ŸããŠã¯ãã®ãã£ãã·ã¥ãè¿ããŸããã€ãŸããããOptionsManager<TOptions>
ãªããžã§ã¯ãã¯ãåžžã«åäžã®TOptions
ãè¿ããŸããOptionsManager<TOptions>
ãéçãªIOptions<TOptions>
ãšããŠãµããŸããããªã¯ãšã¹ãéå§æã®ã¹ãããã·ã§ããã§ããIOptionsSnapshot<TOptions>
ãšããŠãµããŸãã®ãã¯ãDI ã³ã³ãããŒã«å¯ŸããŠã·ã³ã°ã«ãã³ãšããŠç»é²ãããããã¹ã³ãŒãä»ããšããŠç»é²ããããã®éãã ãã§ãããªãããã£ãã·ã¥æ©æ§ãã«ã¹ã¿ãã€ãºããããšã¯ã§ããŸãããIOptionsMonitor<TOptions>
ã®å®è£ ã¯ã·ã³ã°ã«ãã³ãªOptionsMonitor<TOptions>
ã§ãããã®ã¯ã©ã¹ã¯ãDI ãããIOptionsChangeSource<TOptions>
ããã®éç¥ã䜿çšããŠãæ§ææ å ±ã®å€æŽéç¥ãå®è£ ããŸãããªããTOptions
ã®äœæãšãã£ãã·ã¥ã¯ãOptionsManager<TOptions>
ãšåæ§ã§ãããã ããTOptions
ã®äœæãšåæåã DI ãããIOptionsFactory<TOptions>
ã«å§è²ããã®ã¯åãã§ããããã£ãã·ã¥ã«ã€ããŠã¯ DI ãããIOptionsMonitorCache<TOptions>
ã«åŠçãå§è²ããŸããã€ãŸããIOptionsMonitorCache<TOptions>
ã®å®è£ ãå ¥ãæ¿ããããšã§ããã£ãã·ã¥ã®åäœãå€æŽã§ããŸãïŒãã®äœ¿ãéã¯ã¡ãã£ãšæãã€ããŸãããïŒãIOptionsFactory<TOptions>
ã®å®è£ ã¯é·ç§»çãªïŒéœåºŠã€ã³ã¹ã¿ã³ã¹åãããïŒOptionsFactory<TOptions>
ã§ãããã®ãªããžã§ã¯ãã¯TOptions
ãã€ã³ã¹ã¿ã³ã¹åããIConfigureOptions<TOptions>
ãšIPostConfigureOptions<T>
ã䜿çšããŠãªãã·ã§ã³ãåæåãã圹å²ãæã¡ãŸãããã£ãšããTOptions
ã«ã¯new()
å¶çŽãããã®ã§ããã®å®è£ ã¯åã«new TOptions()
ããã ãã§ãããŸãããã®ãã¡ã¯ããªã¯äœæããTOptions
ãIConfigureOptions<TOptions>
ãšIPostConfigureOptions<TOption>
ã«æž¡ããŠåæåãå§è²ããé¢ä¿äžãTOptions
ã«ã¯class
å¶çŽãèŠæ±ããŸãïŒåç §åã«å¶éãããŸãïŒãIOptionsMonitorCache<TOptions>
ã®å®è£ ã¯ãã·ã³ã°ã«ãã³ãªOptionsMonitorCache<TOptions>
ã§ããããã¯ConcurrentDictionary<string, TOptions>
ã䜿çšãããååä»ãæ§æã®ãã¹ã¬ããã»ãŒããªãã£ãã·ã¥ã®åçŽãªå®è£ ã§ãã
ãšããã§ãDI ã®æ§æ㧠services.Configure<TOptions>()
ã§ç»é²ãããã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããã®ã¯ IOptions<TOptions>
ã§ãã£ãŠãTOptions
åãã®ãã®ã§ã¯ãªãã®ã§ããããïŒ
IOptions<TOptions>
ã«ã¯ TOptions
åãè¿ã Value
ããããã£ãããªããäžèŠç¡é§ãªäžéå±€ã«èŠããŸãã
çç±ã¯ãTOptions
ãçæããäžé£ã®ããžãã¯ã DI å¯èœã«ããããããšãªããŸããå®ã¯ãIOptions<TOptions>.Value
ãåæåããå®è£
ã¯ã次ã®ããã«ãªã£ãŠããŸãã
IOtions<TOptions>
ã®æ¢å®ã®å®è£ ã§ããOptionsManager<TOptions>
ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã€ã³ãžã§ã¯ã·ã§ã³ã«ãã£ãŠIOtionsFactory<TOptions>
ãåãåããŸããOptionsManager<TOptions>
ã¯ãå€ïŒValue
ããããã£ïŒã®çæãIOptionsFactory<TOptions>
ã«å§è²ããŸããIOpotionsFactory<TOptions>
ã®æ¢å®ã®å®è£ ã§ããOptionsFactory<TOptions>
ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã€ã³ãžã§ã¯ã·ã§ã³ã§åãåã£ãIConfigureOptions<TOption>
ã®ã³ã¬ã¯ã·ã§ã³ãIPostConfigureOptions<TOptions>
ã®ã³ã¬ã¯ã·ã§ã³ããããŠIOptionsVaildator<TOptions>
ã®ã³ã¬ã¯ã·ã§ã³ã䜿çšããŠã以äžã®ããã«TOptions
ãåæåããŸãã- ãŸãã
IOptionsFactory<TOptions>
ã®å®£èšã«ãããŠTOptions
ã«ã¯new()
å¶çŽãã€ããŠãããããæ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããŠTOptions
åã®ã€ã³ã¹ã¿ã³ã¹ãçæããŸãã IConfigureOptions<TOptions>
ãšIPostConfigureOptions<TOptions>
ã®ã³ã¬ã¯ã·ã§ã³ãããããé çªã«åŒã³åºããŸãïŒãã®ãšããIConfigureOptions<TOptions>
ã®å®äœãIConfigureNamedOptions<TOptions>
ã®å Žåããã¡ãã®å®è£ ãåŒã³åºããŠååä»ãæ§æããµããŒãããŸãïŒããã®ãšããIOptionFactory<TOptions>
ã®TOptions
ã«ã¯class
å¶çŽãã€ããŠãããããIConfigureOptions<TOptions>
ãIPostConfigureOptions<TOptions>
ã«ã¯TOptions
ã®åç §ãæž¡ãããããã®å 容ãå€æŽã§ããŸãã- ïŒ2.2 以éïŒ
IValidateOptions<TOptions>
ã®ã³ã¬ã¯ã·ã§ã³ãé çªã«åŒã³åºããŸãã
- ãŸãã
ãã®ãã㪠DI ã®é£éã«ãããTOptions
ã®åæååŠçã泚å
¥ã§ããããã«ãªããŸãããããŠããã®æ¹æ³ã䜿çšããŠãæ§ææ
å ±ããªãã·ã§ã³å€ã«ãã€ã³ãããŠããŸãã
åè¿°ã®ããã«ãOptionsBuilder<TOptions>.Validate()
æ¡åŒµã¡ãœãã㧠Func<TOptions, bool>
åã®ããªã²ãŒããæž¡ããŠãã«ã¹ã¿ã ã®ããªããŒã·ã§ã³ããžãã¯ãç»é²ã§ããŸããå
·äœçã«èšããšãæ»ãå€ã false
ã®ãšããããªããŒã·ã§ã³ã¯å€±æããŸãããã®ããªããŒã·ã§ã³åŠçã¯ãIValidateOptions<TOptions>
ã®å®è£
ã§ãã ValidateOptions<TOptions>
ã¯ã©ã¹ã§å®è£
ãããŠãããOptionsBuilder<TOptions>
ã¯ãã®ãªããžã§ã¯ãã IValidateOptions<TOptions>
ã®ã·ã³ã°ã«ãã³ãŸãã¯éœåºŠçæã®ãµãŒãã¹ãšã㊠DI ã³ã³ãããŒã«ç»é²ããŸãïŒäŸåå
ãããå Žåã¯éœåºŠçæãããã§ãªãå Žåã¯ã·ã³ã°ã«ãã³ïŒããªããããªããŒã·ã§ã³å€±ææã®ã¡ãã»ãŒãžã¯ãOptionsBuilder<TOptions>.Validate()
æ¡åŒµã¡ãœããã«åŒæ°ãšããŠæž¡ããŸãã
åæ§ã«ãValidateDataAnnotations()
æ¡åŒµã¡ãœããã§ãããŒã¿ã¢ãããŒã·ã§ã³å±æ§ããŒã¹ã®ããªããŒã·ã§ã³ãæå¹ã«ãªããŸããå®è£
㯠DataAnnotationValidateOptions
ã¯ã©ã¹ã§ãSystem.ComponentModel.DataAnnotation.Validator.TryValidateObject()
ã¡ãœããã«åŠçãå§è²ããŸããã·ã³ã°ã«ãã³ãªãµãŒãã¹ãšããŠç»é²ãããŸãããªãããšã©ãŒã¡ãã»ãŒãžã¯ãValidatetionResult
ã®ãªã¹ãããšã«ãDataAnnotation validation failed for members: '{ã«ã³ãåºåãã® ValidationResult.MemberNames}' with the error: '{ ValidationResult.ErrorMessage}'."
ã§åºå®ã§ãã
ãªããããªããŒã·ã§ã³ã«å€±æãããšãããªããŒã·ã§ã³ãåŒã³åºã OptionsFactory<TOptions>
ã®å®è£
㯠ValidationException
ãã¹ããŒããŸããããã«ãOptionsMonitor<TOptions>
ã¯æ§æãœãŒã¹ã®å€æŽãæ€ç¥ããéã«ãå
éšã§ä¿æãããã£ãã·ã¥ãåé€ããŠãã OptionsFactory<TOptions>
ã«æ°ãããªãã·ã§ã³ãèŠæ±ããïŒãããŠãã£ãã·ã¥ã¯æŽæ°ãããªãïŒããšãšããã£ãã·ã¥ã«å€ããªãå Žåã¯åžžã« OptionsFactory<TOptions>
ã«æ°ãããªãã·ã§ã³ãèŠæ±ããã®ã§ãå€æŽåŸã®å€ãããªããŒã·ã§ã³ãšã©ãŒã«ãªã£ãå ŽåãCurrentValue
ã¯äŸå€ãã¹ããŒããŸãã倧æµã®å Žåã¯ãæ§ææ
å ±ãå€æŽã«ãªã£ãå Žåã¯å€ãå€ã§åãç¶ããŠã»ããã§ãããããã以äžã®ããã«ãããšè¯ããšæããŸãïŒããããã¯ãããããªãæèŠã䌺ããããšããã§ããïŒã
IOptionsMonitor<TOptions>
ãåãåã£ãã¯ã©ã¹ã¯ãCurrentValue
ã®å€ããã£ãŒã«ãã«ä¿æããããã®æç¹ã§ãšã©ãŒã®å Žåã¯èµ·åæã®ãšã©ãŒãšããããšã§ãããããããIOptionsMonitor<TOptions>
ãåãåã£ãã¯ã©ã¹ã¯ãOnChange()
ã§ã€ãã³ããã³ãã©ãŒãç»é²ããããã®ã€ãã³ããã³ãã©ãŒã§ã¯ãCurrentValue
ã®å€ã䜿çšããŠããã£ãŒã«ãã®å€ãæŽæ°ããããã®ãšããCurrentValue
ãOptionValidationException
ãã¹ããŒããå Žåããã°ã«åºåãããäœããã®ã¢ã©ãŒããåºããããããã£ãŒã«ãã®å€ãæŽæ°ããã«ããŠããã
æ§ææ
å ±ã®ã³ãŒããè¿œã£ãŠãããšããã°ãã° Microsoft.Extensions.Primitives
ããã±ãŒãžã®åã«è¡ãã€ããŸãããã㯠Microsoft.Extensions
ã«æå±ãããã¬ãŒã ã¯ãŒã¯ã®å
±éã©ã€ãã©ãªçŸ€ã§ã次ã®ãããªæ©èœãå®çŸ©ãããŠããŸãã
IChangeToken
ãå€æŽéç¥ã®ããã®ãã¬ãŒã ã¯ãŒã¯ã§ããIFileProvider
ããã¡ã€ã«åŠçãæœè±¡åããŠããŸãïŒåŸ®åŠã«äœ¿ãã¥ããæ°ãããŸããïŒã