Simple Injectorã©ã€ãã©ãªã®IOC èšäº
æçš¿è Steve
翻蚳ã®èª€ããäžæ£ç¢ºããææããŠããã ããã°å¹žãã§ãã
éå»æ°å¹ŽéãMicrosoftã¯ãã©ãããã©ãŒã ã®æ°ããããŒãžã§ã³ãéçºããŠããŸããã NETïŒ.NET Core .NET Coreã¯ãæ¢åã®.NETãã©ãããã©ãŒã ã®å®å šãªåèšèšã§ãããçã®ã¯ãã¹ãã©ãããã©ãŒã äºææ§ãšã¯ã©ãŠããã¯ãããžãŒãšã®äºææ§ãç®æããŠããŸãã .NET Coreã®éçºãå³å¯ã«è¿œè·¡ããRC1以éããã©ãããã©ãŒã äºæããŒãžã§ã³ã®Simple InjectorããªãªãŒã¹ããŸããã Simple Injector v3.2ã®ãªãªãŒã¹ã§ã¯ã.NET Coreãå ¬åŒã«ãµããŒãããŠããŸãã
ãæ°ã¥ããããããŸããããMicrosoftã¯ãã¬ãŒã ã¯ãŒã¯ã®ã³ã¢ã³ã³ããŒãã³ãã®1ã€ãšããŠç¬èªã®DIã©ã€ãã©ãªãè¿œå ããŸããã 誰ãããã€ãã«ïŒããšå«ã¶ãããããŸããã ãã®ãããªã³ã³ããŒãã³ããååšããªãããã.NETã®å€ãã®ãªãŒãã³ãœãŒã¹DIã©ã€ãã©ãªãçºçããŸããã ãããŠãSimple Injectorã¯æããã«ãããã®1ã€ã§ãã
誀解ããªãã§ãã ãããMicrosoftã.NETã®äž»ãªãã©ã¯ãã£ã¹ãšããŠDIãæšé²ããŠããããšã«æè¬ããŠããŸããããã«ãããDIãå®è·µããããã«å€ãã®éçºè ãç»å Žããæ¥çã«ãã©ã¹ã®åœ±é¿ãäžããå¯èœæ§ããããŸãã ãã ããåé¡ã¯ãMicrosoftãçµã¿èŸŒã¿ã®DIã³ã³ããã®äžã«å®çŸ©ããæœè±¡åããå§ãŸããŸãã 以åã®Resolveæœè±¡åïŒ IDependencyResolverããã³IServiceProvider ïŒãšæ¯èŒããŠãæ°ããæœè±¡åã¯IServiceCollectionã®äžã«Register APIãè¿œå ããŸã ã ãã®Microsoftã®æœè±¡åã®æ¬è³ªã¯ãä»ã®ïŒããæ©èœãè±å¯ãªïŒDIã©ã€ãã©ãªããã©ãããã©ãŒã ã«æ¥ç¶ã§ããã¢ããªã±ãŒã·ã§ã³ããµãŒãããŒãã£ããŒã«ãããã³ãã¬ãŒã ã¯ãŒã¯ã®éçºè ãæšæºåãããæœè±¡åã䜿çšããŠäŸåé¢ä¿ãç»é²ããããšã§ãã ããã«ãããã¢ããªã±ãŒã·ã§ã³éçºè ã¯ãéžæããDIã©ã€ãã©ãªãçµ±åããããã®æšæºãååŸã§ããŸãã
äžèŠãããšããã®ãããªæœè±¡åãæã€ããšã¯è¯ãèãã®ããã«æãããããããŸããã äžè¬çã«èšãã°ããœãããŠã§ã¢æ¥çã«ã¯ïŒè¿œå ã®ïŒæœè±¡åã¬ãã«ãè¿œå ããŠã解決ã§ããªãåé¡ã¯ã»ãšãã©ãããŸããã ãã®å ŽåãMicrosoftã®æšè«ã¯èª€ãã§ãã DIã®å°é家ã¯ãæåãããã®åé¡ã«ã€ããŠèŠåããŠããŸãããã圹ã«ç«ã¡ãŸããã§ããã ããŒã¯ã»ã·ãŒãã³ã¯ã ããã§ãã®ã¢ãããŒãã®åé¡ãããªãæ£ç¢ºã«èª¬æããŸããããç§ã®æèŠã§ã¯ã次ã®éèŠãªç¹ã匷調ããããšãã§ããŸãïŒ
- ãã®ã¢ãããŒãã¯ãæå°å ¬çŽæ°ã«åãã£ãŠåŒããŸãã
- ãã®ã¢ãããŒãã¯ã€ãããŒã·ã§ã³ãæå¶ããŸã
- ãã®ã¢ãããŒãã¯ããŒãžã§ãã³ã°å°çãè¿œå ããŸã
- DIã³ã³ããã䜿çšããªããšäœæ¥ãé£ãããªããŸã
- ã¢ããã¿ãŒã®éçºããªãŒãã³ãœãŒã¹ã³ãã¥ããã£ã®ã¡ã³ããŒã«ãã£ãŠåŠçãããå Žåããããã®ã¢ããã¿ãŒã¯ç°ãªãã¬ãã«ã®å質ãæã¡ã Conforming Containerã®ææ°ããŒãžã§ã³ãšäºææ§ããªãå¯èœæ§ããããŸãïŒçŽã ããã§èª¬æãããã³ãã¬ãŒããåç §ïŒ
ãããã¯ã.NET Coreã®æ°ããDIæœè±¡åã§ä»æ¥çŽé¢ããçã®èª²é¡ã§ãã DIã³ã³ããã¯ã ç»é²APIã«é¢ããŠéåžžã«ãŠããŒã¯ã§äºææ§ã®ãªãæ©èœãåããŠããããšããããããŸã ã ããšãã°ãSimple Injectorã¯ãå€æ°ã®æ§æãšã©ãŒãæ€åºããããã«éåžžã«æ éã«èšèšãããŠããŸãã æãé¡èãªäŸã®1ã€ïŒããã«å€ãã®äŸããããŸãïŒã¯ã圌ã®èšºæèœåã§ãã ããã¯ãDIæœè±¡åã®ãŠãŒã¶ãŒãæã€æåŸ ãšåºæ¬çã«äºææ§ã®ãªãæ©èœã®1ã€ã§ãã ãããããŠãŒã¶ãŒã¯æ°ããæœè±¡åã«äœãæåŸ ããŸããïŒ
DIæœè±¡åãŠãŒã¶ãŒã¯ã3ã€ã®ã°ã«ãŒãã«åé¡ã§ããŸãããã¬ãŒã ã¯ãŒã¯ã®éçºè ãå€éšã©ã€ãã©ãªãããã³ã¢ããªã±ãŒã·ã§ã³èªäœã ç¹ã«ãã¬ãŒã ã¯ãŒã¯ãšå€éšã©ã€ãã©ãªã®éçºè ã¯ãäžè¬çãªæœè±¡åãéããŠäŸåé¢ä¿ã®ç»é²ãè¿œå ããããšèããŠããŸãã ããã2ã€ã®éçºè ã°ã«ãŒãã§ã¯ã䜿çšå¯èœãªãã¹ãŠã®ã¢ããã¿ãŒã§ã³ãŒããæ€èšŒããããšã¯ã»ãŒäžå¯èœã§ãããããçµã¿èŸŒã¿ã³ã³ãããŒã䜿çšããŠã³ãŒãããã¹ãããŸãã ãããŠããããã®éçºè ã¯ãã«ãã€ã³ã³ã³ããã䜿çšããŸãããã©ã®ã¢ããã¿ã䜿çšããŠãããã«ãã€ã³ã³ã³ããããæšæºçãªåäœãæé»çã«æåŸ ããŸãïŒãããããããã¹ãã§ãïŒã ã€ãŸãããã®ã€ã³ã©ã€ã³ã³ã³ããã¯ãã³ã³ãã©ã¯ããšæœè±¡åã®äž¡æ¹ã®åäœãå®çŸ©ããŸãã äœæãããåã¢ããã¿ãŒã¯ãçµã¿èŸŒã¿ã³ã³ãããŒã®æ£ç¢ºãªã¹ãŒããŒã»ããã§ãªããã°ãªããŸããã æšæºããã®éžè±ã¯èš±å¯ãããŸãããããã«ãããçµã¿èŸŒã¿ã³ã³ããã®ããã©ã«ãã®åäœã«äŸåããå€éšã©ã€ãã©ãªã®æäœãäžæãããããã§ãã
Simple Injectorã®èšºæãšæ€èšŒã¯ãéçºã®çç£æ§ãå€§å¹ ã«åäžãããå€ãã®æ©èœã®1ã€ã§ãã ä»ã®DIã©ã€ãã©ãªã䜿çšããå Žåãéçºããã»ã¹ã®ãã£ãšåŸã«çºèŠãããå¯èœæ§ã®ããåé¡ãèŠã€ããããšãã§ããŸãã ãã ãã蚺æãšã¢ããªã±ãŒã·ã§ã³ãããã³ãµãŒãããŒãã£ã³ã³ããŒãã³ããå®è¡ãããšåé¡ãçºçããŸãããµãŒãããŒãã£ã³ã³ããŒãã³ããSimple Injector蚺æã§èªåçã«ãã«ãŒã«ã«åŸã£ãŠãåäœããããšã¯ã»ãšãã©ãããŸããã æšæºã®ã³ã³ããã䜿çšããç¹å¥ãªå Žåã«ç»é²ãïŒããŸãè¡ãã°ïŒãã¹ããããšããŠããSimple InjectorãçããããšèŠãªããããªæ¹æ³ã§äŸåé¢ä¿ãç»é²ããå¯èœæ§ããããŸãã Simple Injectorã®ä»®æ³ã¢ããã¿ãŒããµãŒãããŒãã£ã®äŸåé¢ä¿ãšã¢ããªã±ãŒã·ã§ã³ã®äŸåé¢ä¿ã®ç»é²ãåºå¥ããããšã¯äžå¯èœã§ãã 蚺æãç¡å¹ã«ãããšãæãéèŠãªå®å šã¡ã«ããºã ã®1ã€ãå®å šã«åé€ãããŸããã蚺æãä¿åãããšããµãŒãããŒãã£ã³ã³ããŒãã³ãããã®èª€æ€åºãçºçãããããã®èª€æ€åºã¯ã¢ããªã±ãŒã·ã§ã³éçºè ã«ãã£ãŠæå¶ãããå¿ èŠããããŸãã ãµãŒãããŒãã£ã®ã³ã³ããŒãã³ãã®ç»é²ã¯ã»ãšãã©ã¢ããªã±ãŒã·ã§ã³éçºè ããé ãããŠãããããããããã¹ãŠã®åé¡ã«åãçµãããšã¯é£ãããã€ã©ã€ã©ãããããæã«ã¯äžå¯èœã«ãªãããšãããããŸãã ããã¯è°è«ããããšãã§ããŸã-ãŸããã·ã³ãã«ã€ã³ãžã§ã¯ã¿ãŒã¯ãµãŒãããŒãã£ã®ããŒã«ã§åé¡ãèŠã€ããŸãã ãããããµãŒãããŒãã£ã©ã€ãã©ãªã®éçºè ã«é£çµ¡ããŠãåé¡ãã説æããããšãããšããäºææ§ã®ãªããã¢ããã¿ãéçºããããšã¯ãæããããªã®ã§ã圌ãã¯ããããç§ãã¡ã«ç¢ãåããŸãã
Simple Injectorã®èšºææ©èœã¯ã.NET Core DIæœè±¡åçšã®ã¢ããã¿ãŒãäœæãããšãã«ééããå€ãã®éäºææ§ã®1ã€ã§ãã ãã®ä»ã®éäºææ§ïŒ
- Simple Injector ãã³ã¬ã¯ã·ã§ã³ç»é²ã1察1ã®è¡šç€ºããæ瀺çã«åé¢ããæ¹æ³
- Simple InjectorããªãŒãã³ãžã§ããªãã¯ç»é²ãåŠçããæ¹æ³ã
Simple Injectorãšå®å šã«äºææ§ã®ããã¢ããã¿ãŒãäœæããã«ã¯ããã¬ãŒã ã¯ãŒã¯ã®å€ãã®æåãªæ©èœãåé€ããå¿ èŠããããŸããããã«ãããã©ã€ãã©ãªãŒã®æ¢åã®åäœãå€æŽãããéçºã®æéãšãªã£ãååã«éåãããã®ã«å€ãããŸãã é åã®ãªããœãªã¥ãŒã·ã§ã³ã äºææ§ãæãªãå€æŽã«ã€ãªããã ãã§ãªããSimple Injectorãšéçºè ããããæ°ã«å ¥ã£ãŠããæ©èœãšåäœãæ¶ããŸãã ãã®æå³ã§ã Markã説æããããã«ãã¢ããã¿ãŒãæã€ããšã¯ãæ¯èŠããã€ãããŒã·ã§ã³ãã§ãã Simple Injectorã§ã¯å€ãã®é©æ°ãè¡ã£ãŠãããã¢ããã¿ãŒã«ããSimple Injectorã¯ãŠãŒã¶ãŒã«ãšã£ãŠå®è³ªçã«åœ¹ã«ç«ããªããªããŸãã ãŸããã¢ããã¿ãŒã«ããããããªãæ¹åãé©æ°ãè¡ãããšãã§ããªããªããŸãã Simple Injectorã®å²åŠãéæ¿ã ãšèãã人ããããããããŸããããç§ãã¡ã¯éã£ãèãæ¹ãããŠããŸãã ãŠãŒã¶ãŒã«æãé©ããŠãããšèããããæ¹æ³ã§èšèšããŸããã ãŸãã NuGetããã±ãŒãžã®ããŠã³ããŒãæ°ã¯ãå€ãã®éçºè ãåæããŠããããšã瀺ããŠããŸãã ç¹å®ã®ã¢ããã¿ãŒã«æºæ ããŠãããšããŠãŒã¶ãŒã®ããŒãºãããã«æºããããšãã§ããªããªããŸãã
Simple Injectorã®ããžã§ã³ã¯ä»ã®ã»ãšãã©ã®ã³ã³ãããããæšæºããéžè±ããå¯èœæ§ããããŸãããå°æ¥ã®DIã©ã€ãã©ãªã®äžè¬çãªæœè±¡åã®å®çŸ©ãã®ãã®ã¯ãå°æ¥ã®ã©ã€ãã©ãªã®ãã€ãããŒã·ã§ã³ãæå¶ããããšãããããæ¥é²çãŸãã¯é©æ°çãªèŠç¹ã§ãã Simple InjectorãæäŸããã®ãšåããã§ãã¯ãå°å ¥ããä»ã®ã³ã³ããã®1ã€ãæ³åããŠãã ããã ãã®ãããªæ©èœã¯ãDIæœè±¡åã®å¥çŽã«éåããªãéãå°å ¥ã§ããŸããã ãã®ãããªã¢ããã¿ãŒãæã£ãŠãããšããåãªãäºå®ã¯ãç§ãã¡ã®æ¥çã®é²æ©ã劚ããå¯èœæ§ããããŸãã
ãã®èª¬æã§ãMicrosoft DIæœè±¡åã¯ãæäœå ¬çŽæ°ãã§ã¯ãªãããšãæããã«ããããšæããŸãããæäœå ¬åæ¯ãã¯ãã¹ãŠã®DIã©ã€ãã©ãªãšã®äºææ§ãæå³ããããã§ãã ããã§è¿°ã¹ãããã«ãæ¢åã®DIã©ã€ãã©ãªã¯ã©ãããã®æœè±¡åãšå®å šã«äºææ§ããªãå¯èœæ§ããããŸãã éšåçã«ãããã¯ãçµã¿èŸŒã¿ã³ã³ãããŒãæœè±¡åã³ã³ãã©ã¯ããå®çŸ©ããŠããã«ããããããããã®æœè±¡åã®ãã¹ããå«ããããžã§ã¯ãã«ã¯ããã¹ãŠã®ã·ããªãªã§æ£ç¢ºãªåäœãå®å šã«æ±ºå®ããããªãã®æ°ã®ãã¹ãã±ãŒã¹ããªããšããäºå®ã«èŠçŽãããŸãã ãããŸã§ããã¹ãŠã®ã¢ããã¿ãŒå®è£ ã¯ãã¢ããã¿ãŒå®è£ ãçµã¿èŸŒã¿ã³ã³ãããŒã®åäœãšã»ãŒåæããŠããããšãæšæž¬ããæåãæåŸ ããè©Šã¿ã§ããã ããšãã°ãAutofacéçºè ã¯ãããªãæ·±å»ãªäºææ§ã®åé¡ãããããšã«æ°ã¥ã ãæçµçã«ã¯ ç§ãã¡ ãšåãçµè«ã«éããŸãã ã
Microsoft DIã©ã€ãã©ãªã«æ©èœãè±å¯ã§ãSimple Injectorã®æ€èšŒã蚺æãªã©ã®æ©èœãå«ãŸããŠããã°ãããã»ã©æªãã¯ãããŸããã 次ã«ããã¹ãŠã®æ©èœãåããåãDIã©ã€ãã©ãªã䜿çšã§ããŸãã æ®å¿µãªãããå®è£ ã¯ããã»ã©æ©èœãè±å¯ãšããããã§ã¯ãªããMicrosoftèªèº«ã¯å®è£ ã次ã®ããã«èª¬æããŸããã
æå°éã®DIã³ã³ãããè¿œå ã®æ³šå ¥æ©èœãå¿ èŠãªãå Žåã«äŸ¿å©
ããã«æªãããšã«ãã€ã³ã©ã€ã³ã³ã³ããã¯æœè±¡åã³ã³ãã©ã¯ããå®çŸ©ãããããã€ã³ã©ã€ã³ã³ã³ããã«æ°ããæ©èœãè¿œå ãããšãæ¢åã®ãã¹ãŠã®ã¢ããã¿ãŒãç ŽæããŸãã æœè±¡åã䜿çšãããµãŒãããŒãã£ã®éçºè ã¯ãçµã¿èŸŒã¿ã©ã€ãã©ãªïŒ.NET Coreã®DIïŒã䜿çšããŠïŒåœŒã®ã©ã€ãã©ãªïŒã®ã¿ããã¹ãããŸãã ãŸãããµãŒãããŒãã£ã®éçºè ã®ã©ã€ãã©ãªããã¢ããã¿ã§ãŸã ãµããŒããããŠããªãçµã¿èŸŒã¿ã³ã³ããã«è¿œå ãããæ©èœã«äŸåãå§ãããšãäœããå£ããŠã¢ããªã±ãŒã·ã§ã³éçºè ãèŠããããšã«ãªããŸãã ããã¯ã Mark Seemannã圌ã®ããã°ã§è°è«ããŠããããŒãžã§ã³ç®¡çã®å°çã®äžåŽé¢ã§ãã å°ãªããšãMicrosoftãå€æŽãå ãããã³ã«ã¡ãžã£ãŒããŒãžã§ã³çªå·ãå¢ããããšãé¡ã£ãŠããŸãã çŸåšã®å®è£ ãããããã«ãã§ããã ãã§ãªããå®å šã«äœ¿çšå¯èœãªå€æ©èœDIã³ã³ãããŒã«çºå±ããããšã¯æ±ºããŠãããŸããããªããªãããããã¯è¿œãè©°ããããŠããããã§ããå°æ¥ã®ãã¹ãŠã®å€æŽã¯äºææ§ãå£ãå€æŽã§ããã誰ããæªããªããŸãã
æåã®è§£æ±ºçã¯ãæœè±¡åãšãã®ã¢ããã¿ãŒã®äœ¿çšãå®å šã«é¿ããããšã§ãã Mark Seemannã ãããšããã§éåžžã«æ£ç¢ºã«èª¬æããããã« ãã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯ã¯DIã³ã³ããããŸã£ãã䜿çšããå¿ èŠããªããããããŸããã æ®å¿µãªãããæœè±¡åãå®çŸ©ãããšããäºå®ããæœè±¡åã®äœ¿çšãé¿ããããšãã¯ããã«é£ããããŠããŸãã æœè±¡åãå®çŸ©ãããã®äœ¿çšãç©æ¥µçã«æšé²ããããšã«ãããMicrosoftã¯ã©ã€ãã©ãªããã³ãã¬ãŒã ã¯ãŒã¯ã®æ°åã®ãµãŒãããŒãã£éçºè ãå°ããã©ã€ãã©ãªããã³ãã¬ãŒã ã¯ãŒã¯ã®é©åãªæœè±¡åã®å®çŸ©ã«ã€ããŠèããããšããããããŸãïŒ Mark Seemannã®èšäºã¯ãããæ確ã«èª¬æããŠããŸãïŒ ãã€ã¯ããœããã¯ãäžçå šäœã1ã€ã®å ±éã®æœè±¡åãå¿ èŠãšããŠãããšMicrosoftã«ä¿¡ãããããããéçºè ã¯ãã¯ãããã«ã€ããŠèããŸããã MVCã®æ°ãããã¡ã¯ããªã€ã³ã¿ãŒãã§ãŒã¹ãéåžžã«é ãææã«ç»å Žããããšã¯ãã§ã«èŠãŸããïŒããšãã°ãRC2ããåã®IViewComponentActivatoræœè±¡åãšããŠïŒã ãããŠãMVCããŒã ããã®ãããªãšã©ãŒãéçºãµã€ã¯ã«ã®ãã®ãããªåŸæ段éã«ããããããšãããã£ãå Žåãæ°ãã.NETãã©ãããã©ãŒã ã§éçºãéå§ãããã¹ãŠã®éçºè ã«äœãæåŸ ã§ããŸããïŒ
ãããã«
DIæœè±¡åãå®çŸ©ããããšã¯ãä»åŸæ°å¹Žéç§ãã¡ãæ©ãŸããMicrosoftã®çãŸããééãã§ãã ããã¯ãã§ã«é©æ°ãæå¶ããããŒãžã§ã³ç®¡çã®å°çãçã¿åºããå€ãã®éçºè ãæ··ä¹±ãããŸãã æœè±¡åã¯å€ãã®DIã©ã€ãã©ãªãšäºææ§ããªããå°é家ã®æšå¥šã«åããŠãMicrosoftã¯äžçãäºææ§ã®ãªãã³ã³ãããšéšåçã«äºææ§ã®ããã³ã³ããã«åå²ããããšã§ãããç¶æããããšã決å®ããŸãããããã«ãããDIæœè±¡åãå®è£ ããã¢ããã¿ãšãã®æœè±¡åã䜿çšãããµãŒãããŒãã£ã©ã€ãã©ãªã«é¢ããåé¡ã®ç¡éã®å ±åã«ã€ãªãããŸãã
ã¢ããªã±ãŒã·ã§ã³éçºè ãšããŠã®ç§ãã¡ã®æèŠã§ã¯ãã¢ããã¿ãŒã®äœ¿çšã¯æ§ããã¹ãã§ãã 次ã®èšäºã§ã¯ãããã«ã¢ãããŒãããæ¹æ³ãšãäºææ§ã®ãªãã³ã³ãããŒããªããŠãããããä¿¡é Œã§ããæ¹æ³ã§ããçç±ã«ã€ããŠè©³ãã説æããŸãã
é£çµ¡ãåãåããŸãããã