ç§ãéçºããã³ä¿å®ããŠãããããžã§ã¯ãã®ç¯å²ã¯éåžžã«åºãã§ãã ãã®ããã圌ãã¯äŸåæ§æ³šå
¥ãã¿ãŒã³ãç©æ¥µçã«äœ¿çšããŠããŸãã
å®è£
ã®æãéèŠãªéšåã¯ã³ã³ããžã·ã§ã³ã«ãŒãã§ãã ã³ã³ããžã·ã§ã³ã«ãŒãã¯éåžžã Register-Resolve-Releaseãã¿ãŒã³ã䜿çšããŠå®è¡ãããŸãã Composition Rootã®èªã¿ãããã³ã³ãã¯ãã§è¡šçŸåè±ããªèª¬æã®ããã«ã DIã³ã³ãããŒãªã©ã®ããŒã«ãé垞䜿çšãããŸããéžæãããã°ã Autofacã䜿çšããããšã奜ã¿ãŸãã
ãã®ã³ã³ããã¯å©äŸ¿æ§ã®é¢ã§åœç¶ãšèããããŠããŸãããéçºè
ã«ã¯å€ãã®è³ªåãèŠæ
ãããããŸãã ç§èªèº«ã®å®è·µããã®æãäžè¬çãªåé¡ã«ã€ããŠã¯ãAutofacãã³ã³ããžã·ã§ã³ã«ãŒãæ§æããŒã«ãšããŠäœ¿çšããããšã«äŒŽãã»ãšãã©ãã¹ãŠã®åé¡ã軜æžãŸãã¯å®å
šã«è§£æ¶ããæ¹æ³ã説æããŸãã
å€ãã®æ§æãšã©ãŒã¯ãå®è¡æã«ã®ã¿æ€åºãããŸãã
Asã¡ãœããã®ã¿ã€ãã»ãŒãããŒãžã§ã³
æ倧ã®å¹æãæã€æå°ã®è£œåïŒ
public static IRegistrationBuilder<T, SimpleActivatorData, SingleRegistrationStyle> AsStrict<T>( this IRegistrationBuilder<T, SimpleActivatorData, SingleRegistrationStyle> registrationBuilder) { return registrationBuilder.As<T>(); } public static IRegistrationBuilder<T, ConcreteReflectionActivatorData, SingleRegistrationStyle> AsStrict<T>( this IRegistrationBuilder<T, ConcreteReflectionActivatorData, SingleRegistrationStyle> registrationBuilder) { return registrationBuilder.As<T>(); }
CïŒã¯äžè¬åã®ããã®éšåçãªã¿ã€ãã®èªååºåããµããŒãããŠããªããããã¢ã¯ãã£ããŒã·ã§ã³ããŒã¿ãšç»é²ã¹ã¿ã€ã«ã®äžè¬çãªçµã¿åããããšã«1è¡ã®ã¡ãœãããèšè¿°ããå¿
èŠããããŸãã
ããããå¯äžã®ãã©ã¹ã¯ãã¹ãŠã®ã³ã¹ããè² æ
ããŸããçŸåšãã€ã³ã¿ãŒãã§ã€ã¹ã®ã¿ã€ããšå®è£
ã®äžäžèŽã«ãããã³ã³ãã€ã«ãšã©ãŒãçºçããŸãã
AsStrictãžã®ç§»è¡ã容æã«ããåã·ã£ãŒãèŠæ¬ãµã³ãã«
ãã§ã«ããªã倧ããªãããžã§ã¯ããããå Žåã¯ã ã«ã¹ã¿ã Resharper眮æãã¿ãŒã³ã䜿çšããŠãã¿ã€ãã»ãŒãããŒãžã§ã³ã®Asã®å®è£
ãä¿é²ã§ããŸã ã
ã·ã³ã°ã«ã©ã€ããŒããšã«1ã€ã®ãµã³ãã«ãååŸããŸããã æ€çŽ¢åŒãšçœ®æåŒã¯èª°ã§ãåãã§ãã
// $builder$.As<$type$>() builder - expression placeholder type - type placeholder // $builder$.AsStrict<$type>()
ãã ããåãµã³ãã«ã®$ builder $ã®åå¶éã¯ç°ãªããŸãã
IRegistrationBuilder<$type$, SimpleActivatorData, SingleRegistrationStyle> IRegistrationBuilder<$type$, ConcreteReflection, SingleRegistrationStyle>
ããã圹ã«ç«ã€ãããããŸããïŒ
- å®è£
ã®äœæã埮調æŽã§ããŸã
- åã®ç»é²ãšæ¯èŒããŠãæ瀺çãªãã©ã¡ãŒã¿ãŒã®è»¢éã¯ç°¡åã§æ確ã§ã
- å®è£
ã解決ãããšãã®ããã©ãŒãã³ã¹ã®åäž
...ããããæ¬ ç¹ããããŸãïŒ
- ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã·ã°ããã£ãå€æŽããã«ã¯ãç»é²ã³ãŒããä¿®æ£ããå¿
èŠããããŸãã
- åã®ç»é²ã¯ãæãåçŽãªããªã²ãŒãã®ç»é²ãããæããã«ã³ã³ãã¯ãã§ã
ã©ã®ã¿ã€ããããªã²ãŒããä»ããŠç»é²ãããŠããããç解ããããšã¯å°é£ã§ã
RegisterType <>ïŒïŒãåäžã®ã€ã³ã¿ãŒãã§ã€ã¹ããã³å®è£
ã¿ã€ãã§äœ¿çšãããªãéããAsStrictã䜿çšããŠã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ããæå®ããããšãåžžã«æåã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ã®ã¿ã€ããšããªã²ãŒãã«ãã£ãŠè¿ãããå€ã«äºææ§ããªãå Žåãã³ã³ãã€ã«ãšã©ãŒã¯ããŒãã¹ã«ãªããŸãã
å®è£
ã®å§ä»»ç»é²ã¯ã¹ããŒã¹ãåããããŸã
ç¹ã«ãç»é²ã®ã»ãããç»é¢ã«åãŸããªããªãããšãåå ã§ããå Žåã¯ãè€æ°è¡ã«ãªãããšããããŸãã
æãç°¡åãªæ¹æ³ã¯ãããªã²ãŒããä»ããŠContainerBuilderã®æ¡åŒµã¡ãœããã«ç»é²ãå²ãåœãŠãããšã§ãã
public static IRegistrationBuilder<Implementation, SimpleActivatorData, SingleRegistrationStyle> RegisterImplementation( this ContainerBuilder builder) { return builder.Register(c => {
åã®æ¹æ³ãšçµã¿åãããŠäœ¿çšââããããšããå§ãããŸã
builder.RegisterImplementation().AsStrict<IInterface>();
ååä»ã代çç»é²ãèŠã€ããã®ãé£ãã
Autofacã¯auto-bindingãä»ããŠãã®ãããªããªã²ãŒãã®å€ã解決ã§ããŸãããããã€ãã®ãã¥ã¢ã³ã¹ããããŸãã
- å¿åããªã²ãŒãïŒFuncïŒã®ãã©ã¡ãŒã¿ãŒãã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã¡ãŒã¿ãŒãã¿ã€ãããšã«ãããã³ã°ãããŠããå Žåãååä»ãããªã²ãŒãã®ãã©ã¡ãŒã¿ãŒã¯ååããšã«ãããã³ã°ãããŸã
- å¿åããªã²ãŒãã«ãã£ãŠè¿ãããå€ã®åãããã«è¡šç€ºãããå Žåãååä»ãã®ãã®ã«ã€ããŠã¯ããŸããã®å®çŸ©ã«ç§»åããŸã
ãã®çµæãååä»ãããªã²ãŒãã¯ãé©åãªç»é²ãæ€çŽ¢ãããšããšã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã¡ãŒã¿ãŒãæ¯èŒãããšãã®2ã€ã®è¿œå ã¬ãã«ã®éæ¥æ§ãçŽã¡ã«äœæããŸãã
ååä»ãããªã²ãŒãã®ãªããã¢ãŠã
ã³ã³ã¹ãã©ã¯ã¿ãŒã«åãåã®ãã©ã¡ãŒã¿ãŒããªãå Žåãå¿åããªã²ãŒãã§çœ®ãæããããšã¯åºæ¬ã§ãã
ãã以å€ã®å Žåã¯ãåå¥ã«ç»é²ããå¿
èŠã®ããæ§é ãã¯ã©ã¹ããŸãã¯ã€ã³ã¿ãŒãã§ãŒã¹ïŒEventArgsãªã©ïŒã§å€ãã®ãã©ã¡ãŒã¿ãŒã眮ãæããããšãã§ããŸãã
ååä»ãããªã²ãŒãã®æ瀺çãªç»é²
ãã®ãªãã·ã§ã³ã¯ãDIã³ã³ããããã®ããžãã¹ãšã³ãã£ãã£ã®ç¬ç«æ§ã®èŠ³ç¹ããã¯ããæ£ç¢ºã§ãããè¿œå ã®éæ¥åãæ£åžžã«æé€ããŸããããã詳现ãªç»é²ãå¿
èŠã§ãã
ã³ã³ããŒãã³ãã®åæåã«å¿
èŠãªé åºãç¶æããããšã¯å°é£ã§ã
ãã®åé¡ã¯ãDIãã¿ãŒã³ã«åºã¥ããŠæ§ç¯ããããããžã§ã¯ãã«ã¯ãªãããã«æãããŸãã ãã ããå€éšãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãç°ãªãèšèšã®åå¥ã®ã¯ã©ã¹ã䜿çšããããšãåžžã«å¿
èŠã«ãªãå ŽåããããŸãã ç¶æ¿ã³ãŒãããã°ãã°è²¢ç®ããŸãã
åŸæ¥ãDependency Injectionãã¿ãŒã³ã®å Žåãã·ãŒã±ã³ã¹ã¯äŸåé¢ä¿ã«çœ®ãæããããŸãã
RegisterInstanceãä¿®æ£
RegisterInstanceãžã®åŒã³åºãã¯äºå®äžã®Resolveã§ãããç»é²äžã§ãã£ãŠã¯ãªããŸããã äºåã«äœæãããå®è£
ã§ãããSingleInstanceãšããŠããé©åã«ç»é²ãããŸãã
ã«ã¹ã¿ã åæåã¯ã©ã¹ã®äœæ
ã³ã³ããžã·ã§ã³ã«ãŒãå
ã§ã¢ãããã¯ãšèŠãªãããåæåã¢ã¯ã·ã§ã³ã«å¯ŸããŠãåå¥ã®ã¯ã©ã¹ãäœæãããŸãã ã¢ã¯ã·ã§ã³èªäœã¯ããã®ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§å®è¡ãããŸãã
ãã¡ã€ãã©ã€ãºãå¿
èŠãªå Žå-éåžžã®IDisposableãå®è£
ãããŸã
ãã®ãããªåã¯ã©ã¹ã¯ãIInitializerããŒã«ãŒã€ã³ã¿ãŒãã§ã€ã¹ãç¶æ¿ããŸãã
ã³ã³ããžã·ã§ã³ã«ãŒãã¯ãResolveã
context.Resolve<IEnumerable<IInitialization>>();
åæåã®é åº
äžéšã®åæåã¢ã¯ã·ã§ã³ãä»ã®ã¢ã¯ã·ã§ã³ãããåŸã«å®è¡ããå¿
èŠãããå ŽåãåŸã®ã¢ã¯ã·ã§ã³ã§ã¯ãåã®ã¢ã¯ã·ã§ã³ã§å®è£
ãããã€ã³ã¿ãŒãã§ãŒã¹ãžã®ãªã³ã¯ã䜿çšããã ãã§ååã§ãã ãã®ãããªãªã³ã¯ããªãå ŽåïŒã¢ã¯ã·ã§ã³ã®ç¹å®ã®é åºã®èŠä»¶ã®ã¿ãååšããå ŽåïŒã以åã®ã¢ã¯ã·ã§ã³ã®åæåã¯ã©ã¹ã¯ããŒã«ãŒã€ã³ã¿ãŒãã§ã€ã¹ã§ããŒã¯ããã察å¿ããã¿ã€ãã®ãã©ã¡ãŒã¿ãŒããlateãåæåã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«è¿œå ãããŸãã
ãã®çµæã次ã®ãã³ãååŸãããŸãã
- è€éãªåæåããã»ã¹ã¯ãå°ãããã·ã³ãã«ã§ãå®è£
ãããããåå©çšå¯èœãªéšåã«åãããŠããŸã
- Autofacèªäœã¯ãåæååãè¿œå ãåé€ããŸãã¯å€æŽãããšãã«æ£ããåæåé åºã調æŽããŸã
- Autofacã¯ããã®æ³šæã®èŠä»¶ã®ãµã€ã¯ã«ãšäžæãèªåçã«æ€åºããŸã
- å®éãRRRãã¿ãŒã³ã®å®è£
ã¯ãç¹å®ã®ã¢ãžã¥ãŒã«ããããžã§ã¯ãã«äŸåããªãå¥ã®ã¯ã©ã¹ã«ç°¡åã«ç§»åã§ããŸã
å¯äžã®æ¬ ç¹ã¯ãåæåå
šäœã®èŠèŠåã倱ãããããšã§ããããã¯ãå人çã«ã¯åé¡ãèæ
®ããŠããŸãããããã¯ãææ
®æ·±ããã°ã«ãã£ãŠç°¡åã«è£è¶³ãããããã§ãã
æ§æã«ãŒãã倧ãããã
Autofacã®ããã¥ã¡ã³ãã§ã¯ã Moduleã¯ã©ã¹ã®ç¬èªã®åå«ã䜿çšããããšãæšå¥šããŠããŸãã ããã¯å°ã圹ç«ã¡ãŸããããããå°ã圹ç«ã¡ãŸãã åé¡ã¯ãã¢ãžã¥ãŒã«èªäœãäºãã«åé¢ãããŠããªãããšã§ãã ããã¢ãžã¥ãŒã«ã«ç»é²ãããã¯ã©ã¹ãå¥ã®ã¢ãžã¥ãŒã«ã«äŸåããããšã劚ãããã®ã¯äœããããŸããã ãŸããåãã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ãå¥ã®ã¢ãžã¥ãŒã«ã«åç»é²ããããšãåé¡ã§ã¯ãããŸããã
å解æ§æã«ãŒã
Autofacã䜿çšãããšãLifetimeScopeãäœæãããšãã«ãããã¥ã¡ã³ãæ©èœã®ç»é²æ©èœã§éåžžã«æ§ããã«èª¬æãããŠããæ¹æ³ã䜿çšããŠãåäžã®ã¢ããªã·ãã¯ã³ã³ããžã·ã§ã³ã«ãŒããã«ãŒããšåã®çµã¿åããã«åå²ã§ããŸãã
åã¢ã»ã³ããªãã€ã³ãã䜿çšãããšããŸã£ããåãæäœãå®è¡ããŠãç¹å®ã®åã¢ã»ã³ããªãã€ã³ãã®ç»é²ã®èª¬æãèªåã®èŠ³ç¹ãã劥åœãªãã¬ãŒã ã¯ãŒã¯å
ã«åãŸããŸã§ç¹°ãè¿ãããšãã§ããŸãïŒç§ã«ãšã£ãŠã¯ããã1ã€ã®ç»é¢ã§ãïŒã
InstanceForLifetimeScopeãä¿®æ£
LifetimeScopeã®äœææã«ã³ã³ããŒãã³ãç»é²ã®äœ¿çšãéå§ãããšãããã«å¥ã®ããããå°ããªãã³ã ã€ãŸãInstanceForLifetimeScopeããã³InstancePerMatchedLifetimeScopeã®å®å
šãªæåŠãååŸã§ããŸãã ãããã®ã³ã³ããŒãã³ãããã€ãã£ãLifetimeScopeã®SingleInstanceãšããŠç»é²ããã ãã§ãã éäžã§ãLifetimeScopeã¿ã°ãžã®äŸåããªããªããå¿
èŠã«å¿ããŠãããã䜿çšããããšãå¯èœã«ãªããŸããç§ã®å ŽåãåLifetimeScopeã¯ã¿ã°ãšããŠäººéãèªããäžæã®ååãååŸããŸãã
åã®ã³ã³ããžã·ã§ã³ã«ãŒãã®äŸ¿å©ãªç»é²
æ®å¿µãªããã BeginLifetimeScopeãçŽæ¥äœ¿çšããã®ã¯ç°¡åã§ã¯ãããŸãã ã ãããããã®æ²ãã¿ã¯æ¬¡ã®æ¹æ³ã§è§£æ±ºã§ããŸãïŒ
ããã¯æãäžè¬çãªäœ¿çšäŸã§ãããåã¹ã³ãŒãã®ãã©ã¡ãŒã¿ãŒã®åãæž¡ããšã¿ã°çæã䜿çšããŠãã¡ã¯ããªãäœæã§ããŸãïŒTã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããªããžã§ã¯ãããšã«åå¥ã®åã¹ã³ãŒããäœæãããŸãïŒã
éèŠãªãã€ã³ãïŒå
éšã¹ã³ãŒãã®ã¿ã€ã ãªãŒãªã¯ãªãŒãã³ã°ã¯èªåã§è¡ãå¿
èŠããããŸãã ç§ã®ä»¥åã®èšäºã®1ã€ããã®ã¢ã€ãã¢ã¯ãããã«åœ¹ç«ã¡ãŸãã
é·æïŒ
- å€éšã¹ã³ãŒãã¯å
éšã«äŸåããŸããã
- å€éšã¹ã³ãŒãã«ç»é²ãããŠãããã¹ãŠã®ãã®ã¯ãå
éšã§å©çšå¯èœã§ãã
- å
éšã¹ã³ãŒãã®ç»é²ã¯ãå€éšã¹ã³ãŒããšç°¡åã«ãªãŒããŒã©ããã§ããŸãã
çæïŒ
- å
éšã¹ã³ãŒãã¯ãå®è£
ã®ç¶æ¿ã®é
åããã¹ãŠããŒãããŸã
次ã®ã¡ãœããã䜿çšãããšãå
éšã¹ã³ãŒãã®å€éšãžã®äŸåãå®å
šã«å¶åŸ¡ã§ããŸãïŒå®å
šã«åé¢ããããªãã·ã§ã³ãå«ãïŒã
public static IRegistrationBuilder<Func<TParameter, T>, SimpleActivatorData, SingleRegistrationStyle> RegisterWithIsolatedScope<T, TParameter>( this ContainerBuilder builder, Func<IComponentContext, TParameter, object> innerScopeTagResolver, Action<ContainerBuilder, IComponentContext, TParameter> innerScopeBuilder, Func<IComponentContext, IComponentContext, TParameter, T> factory) { return builder.Register<Func<TParameter, T>>(c => p => { var innerScope = new ContainerBuilder().Build().BeginLifetimeScope( innerScopeTagResolver(c, p), b => innerScopeBuilder(b, c, p)); return factory(c, innerScope, p); }); }
ãŸãšã
- è€éãªã±ãŒã¹ã§äŸåæ§æ³šå
¥ãå®å
šã«äœ¿çšããã«ã¯ãé©åãªããŒã«ïŒã³ã³ãããŒïŒãšãã®äœ¿çšã«ãããéçºè
ã®ååã«çºéããã¹ãã«ã®äž¡æ¹ãå¿
èŠã§ãã
- Autofacã®ãããªæè»ã§åŒ·åãã€ååã«ææžåãããã³ã³ããã§ãããç¹å®ã®ãããžã§ã¯ãããã³ç¹å®ã®ããŒã ã®ããŒãºã«åãããŠãã¡ã€ã«ãããããæ¹è¯ããå¿
èŠããããŸãã
- Autofacã䜿çšããã¢ã»ã³ããªãã€ã³ãã®å解ã¯éåžžã«å¯èœã§ããå
¬åŒããã¥ã¡ã³ãã«ã¯èšèŒãããŠããŸãããããã®ãããªã¢ã€ãã¢ã®å®è£
ã¯æ¯èŒçç°¡åã§ãã
- Autofacã¢ãžã¥ãŒã«ã¯ã«ãã»ã«åãæäŸããªããããå解ã«ã¯é©ããŠããŸããã
PSïŒãšãã¹ãã©ãšæ¹å€ã¯äŒçµ±çã«æè¿ãããŠããŸãã