ç®æ¬¡
- ã¯ããã«
- Prismã¢ããªã±ãŒã·ã§ã³ã®åæå
- ã³ã³ããŒãã³ãéã®äŸåé¢ä¿ã®ç®¡ç
- ã¢ãžã¥ã©ãŒã¢ããªã±ãŒã·ã§ã³éçº
- MVVMãã¿ãŒã³ã®å®è£
- é«åºŠãªMVVMã·ããªãª
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®äœæ
- ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ã¬ã€ãã©ã€ã³
- ããã²ãŒã·ã§ã³
- ãã¥ãŒããŒã¹ã®ããã²ãŒã·ã§ã³
- ççµåã³ã³ããŒãã³ãéã®çžäºäœçš
Prismã©ã€ãã©ãªã䜿çšããŠäœæãããã¢ããªã±ãŒã·ã§ã³ã¯ãéåžžãççµåã®ãµãŒãã¹ãšã³ã³ããŒãã³ãã§æ§æãããå¯èœæ§ã®ããè€åã¢ããªã±ãŒã·ã§ã³ã§ãã ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã³ã³ãã³ããæäŸãããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ã®éç¥ãåä¿¡ã§ããããã«ãçžäºã«å¯Ÿè©±ããå¿
èŠããããŸãã ãããã¯ççµåã§ãããããçžäºäœçšã®æ¹æ³ãå¿
èŠã§ããããããªãã§ã¯å¿
èŠãªæ©èœãååŸã§ããŸããã
ãã¹ãŠã®éšåããªã³ã¯ããããã«ãPrismã¢ããªã±ãŒã·ã§ã³ã¯DIã³ã³ãããŒã«äŸåããŠããŸãã DIã³ã³ãããŒã¯ãã³ã³ãããŒã®æ§æã«å¿ããŠã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åããåç¶æéã管çããæ¹æ³ãæäŸããããšã«ããããªããžã§ã¯ãéã®äŸåé¢ä¿ãæžãããŸãã ã³ã³ããã䜿çšããŠãªããžã§ã¯ããäœæããå Žåãå¿
èŠãªäŸåé¢ä¿ããããã«æ³šå
¥ããŸãã äŸåé¢ä¿ããŸã äœæãããŠããªãå Žåãæåã«ã³ã³ãããããããäœæããç¬èªã®äŸåé¢ä¿ã解決ããŸãã å Žåã«ãã£ãŠã¯ãã³ã³ããèªäœãäŸåé¢ä¿ãšããŠæ¿å
¥ãããŸãã ããšãã°ãUnityã䜿çšããå Žåãã¢ãžã¥ãŒã«ã«ãã¥ãŒãšãµãŒãã¹ãç»é²ã§ããããã«ãã³ã³ãããŒãã¢ãžã¥ãŒã«ã«åã蟌ãŸããŸãã
ã³ã³ããã䜿çšããããšã«ã¯ããã€ãã®å©ç¹ããããŸãã
- ã³ã³ããã«ãããã³ã³ããŒãã³ãããã®äŸåé¢ä¿ãç¹å®ããããã©ã€ãã¿ã€ã ãå¶åŸ¡ãããããå¿
èŠããªããªããŸãã
- ã³ã³ããã䜿çšãããšãã³ã³ããŒãã³ãã«åœ±é¿ãäžããããšãªãå®è£
ã眮ãæããããšãã§ããŸãã
- ã³ã³ããã¯ãã¹ã容ææ§ãä¿é²ãããªããžã§ã¯ãã«åœã®äŸåé¢ä¿ãåã蟌ãããšãã§ããŸãã
- ã³ã³ããã¯ãã·ã¹ãã ã«æ°ããã³ã³ããŒãã³ããç°¡åã«è¿œå ã§ããããã«ããããšã§ãã¡ã³ããã³ã¹ãç°¡çŽ åããŸãã
Prismã©ã€ãã©ãªã«åºã¥ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ãã§ã¯ãã³ã³ããã䜿çšããããšã«ã¯ç¹å®ã®å©ç¹ããããŸãã
- ã³ã³ããã¯ãããŒãæã«ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ã解決ããŸãã
- ã³ã³ããã¯ããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ãšãã¥ãŒã®ç»é²ãšäœæã«äœ¿çšãããŸãã
- ã³ã³ããã¯ããã¥ãŒã¢ãã«ãäœæãããã¥ãŒãåã蟌ãããšãã§ããŸãã
- ã³ã³ãããŒã¯ããªãŒãžã§ã³ãããŒãžã£ãŒãã€ãã³ãã¢ã°ãªã²ãŒã¿ãŒãªã©ã®è€åã¢ããªã±ãŒã·ã§ã³ãµãŒãã¹ãå®è£
ããŸãã
- ã³ã³ããã¯ãã¢ãžã¥ãŒã«åºæã®ãµãŒãã¹ãã¢ãžã¥ãŒã«åºæã®æ©èœã«ç»é²ããããã«äœ¿çšãããŸãã
ã泚æ
Prismããã¥ã¢ã«ã®äžéšã®äŸã§ã¯ãUnity Application BlockïŒUnityïŒã³ã³ãããŒã䜿çšããŠããŸãã Modularity QuickStartsãªã©ã®ãã®ä»ã®ãã®ã¯ãManaged Extensibility FrameworkïŒMEFïŒã䜿çšããŸãã Prismã®ã©ã€ãã©ãªèªäœã¯äœ¿çšãããã³ã³ããã«äŸåãããCastleWindsorãAutofacãStructuremapãSpring.NETãªã©ã®ãã®ä»ã®ã³ã³ããã§ãã®ãµãŒãã¹ãšãã¿ãŒã³ã䜿çšã§ããŸãã
éèŠãªæ±ºå®ïŒäŸåæ§æ³šå
¥ã³ã³ãããŒã®éžæ
Prismã©ã€ãã©ãªã¯ãUnityãšMEFã®2ã€ã®ããã©ã«ãDIã³ã³ãããæäŸããŸãã Prismã¯æ¡åŒµå¯èœã§ãããããå°éã®ã³ãŒããèšè¿°ããŠããããé©åãããããšã«ãããä»ã®ã³ã³ããã䜿çšã§ããŸãã UnityãšMEFã¯ãéåžžã«ç°ãªãåäœãããŸãããäŸåé¢ä¿ã®å®è£
ã«å¿
èŠãªåãåºæ¬æ©èœãæäŸããŸãã äž¡æ¹ã®ã³ã³ãããæäŸããæ©èœã®äžéšïŒ
- ã©ã¡ãããã³ã³ããã«ã¿ã€ããç»é²ã§ããŸãã
- ã©ã¡ãããã³ã³ããã«ã€ã³ã¹ã¿ã³ã¹ãç»é²ã§ããŸãã
- ã©ã¡ãããç»é²æžã¿ã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ã匷å¶ããããšãã§ããŸãã
- ã©ã¡ãããç»é²æžã¿ã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒã«æ³šå
¥ããŸãã
- ã©ã¡ãããããããã£ã«ç»é²æžã¿ã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãåã蟌ã¿ãŸãã
- ã©ã¡ãã«ããã¿ã€ããšäŸåé¢ä¿ã管çããããã®å®£èšå±æ§ããããŸãã
- ã©ã¡ãããªããžã§ã¯ãã®ã°ã©ãã®äŸåé¢ä¿ã解決ããŸãã
Unityã¯ãMEFã«ã¯ãªãããã€ãã®æ©èœãæäŸããŸãã
- ç»é²ããã«ç¹å®ã®ã¿ã€ããèš±å¯ããŸãã
- ãªãŒãã³æ±åïŒ Generics ïŒãèš±å¯ããŸãã
- ã¡ãœããåŒã³åºãã®ã€ã³ã¿ãŒã»ããã䜿çšããŠãã¿ãŒã²ããã«è¿œå æ©èœãè¿œå ã§ããŸãïŒ Interception ïŒã
MEFã¯ãUnityã§ã¯å©çšã§ããªãããã€ãã®æ©èœãæäŸããŸãã
- ãã¡ã€ã«ã·ã¹ãã ãã£ã¬ã¯ããªå
ã®ã¢ã»ã³ããªãåå¥ã«æ€åºããŸãã
- XAPãã¡ã€ã«ãããŒããããã®äžã®ã¢ã»ã³ããªãæ¢ããŸãã
- æ°ããã¿ã€ããæ€åºããããšãã«ãããããã£ãšã³ã¬ã¯ã·ã§ã³ã®åæ§æãå®è¡ããŸãã
- 掟çåãèªåçã«ãšã¯ã¹ããŒãããŸãã
- 4çªç®ã®ããŒãžã§ã³ããå§ãŸã.NET Frameworkãä»å±ããŠããŸãã
ã³ã³ããã¯æ©èœãç°ãªããåäœãç°ãªããŸãããPrismã©ã€ãã©ãªã¯ã©ã®ã³ã³ããã§ãåäœã§ããåãæ©èœãæäŸããŸãã ã©ã®ã³ã³ããã䜿çšããããæ€èšãããšãã¯ã以åã®çµéšã念é ã«çœ®ããã©ã®ã³ã³ãããã¢ããªã±ãŒã·ã§ã³ã¹ã¯ãªããã«æé©ããå€æããŠãã ããã
ã³ã³ããã®èæ
®äºé
ã³ã³ããã䜿çšããåã«èæ
®ãã¹ãããšïŒ
- ã³ã³ããã䜿çšããŠã³ã³ããŒãã³ããç»é²ããã³è§£æ±ºããããšãé©åãã©ãããæ€èšããŠãã ããã
- ã³ã³ããã«ç»é²ããŠã€ã³ã¹ã¿ã³ã¹ã解決ããéã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãããªãã®ã±ãŒã¹ã§èš±å®¹ã§ãããã©ãããæ€èšããŠãã ããã ããšãã°ãæç»ã¡ãœããå
ã§äœããæç»ããããã«10,000åã®ããªãŽã³ãäœæããå¿
èŠãããå Žåãã³ã³ãããä»ããŠãã¹ãŠã®ããªãŽã³ãäœæãããšãããã©ãŒãã³ã¹ã倧å¹
ã«äœäžããå¯èœæ§ããããŸãã
ã泚æ
äžéšã®ã³ã³ããã¯ãæ°ããããŒã¯ãŒãã䜿çšããŠãªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ãäœæããã®ãšã»ãŒåãéãã§ãªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã解決ã§ããŸãã ãããããããã«ããŠããã«ãŒãå
ã®å€æ°ã®ãªããžã§ã¯ãã®ã³ã³ãããŒãä»ãã解決ã¯ãçå£ã«æ£åœåãããå¿
èŠããããŸãã
- æ·±ãäŸåé¢ä¿ãå€æ°ããå Žåããããã解決ããããã«å¿
èŠãªæéã倧å¹
ã«å¢å ããå¯èœæ§ããããŸãã
- ã³ã³ããŒãã³ãã«äŸåé¢ä¿ããªãå ŽåããŸãã¯ã³ã³ããŒãã³ãèªäœãä»ã®ã¿ã€ãã®äŸåé¢ä¿ã§ãªãå Žåãã³ã³ãããäœæãããšãã«äœ¿çšããããã³ã³ããã«é
眮ãããããããšã¯ããããæå³ããããŸããã
- ã³ã³ããŒãã³ãã«ããã®äžå¯æ¬ ãªéšåã§ããåäžã®äŸåé¢ä¿ã»ããããããå€æŽãããªãå Žåãäœææã«ã³ã³ããã䜿çšããæå³ããªãå ŽåããããŸãã ãã ãããã®å Žåããã¹ãã¯è€éã«ãªãå¯èœæ§ããããŸãã
- ã³ã³ããŒãã³ããã·ã³ã°ã«ãã³ãšããŠç»é²ããããã€ã³ã¹ã¿ã³ã¹ãšããŠç»é²ããããæ€èšããŸãã
- ã³ã³ããŒãã³ããããã®ã³ã°ãµãŒãã¹ãªã©ã®åäžã®ãªãœãŒã¹ãããŒãžã£ãŒãšããŠæ©èœããã°ããŒãã«ãµãŒãã¹ã§ããå Žåãã·ã³ã°ã«ãã³ãšããŠç»é²ã§ããŸãã
- ã³ã³ããŒãã³ããå€æ°ã®ã³ã³ã·ã¥ãŒããŒã«äžè¬ç¶æ
ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããå Žåãã·ã³ã°ã«ãã³ãšããŠç»é²ã§ããŸãã
- ãªããžã§ã¯ãããããã€ããããã³ã«æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããå¿
èŠãããå Žåãã·ã³ã°ã«ãã³ãšããŠç»é²ã§ããŸããã ããšãã°ãåãã¥ãŒã«ã¯ããããããã¥ãŒã¢ãã«ã®æ°ããã€ã³ã¹ã¿ã³ã¹ãå¿
èŠã§ãã
- ã³ã³ãããã³ãŒãã§æ§æããããæ§æãã¡ã€ã«ã䜿çšããŠæ§æããããæ€èšããŸãã
- ãã¹ãŠã®ãµãŒãã¹ãäžå
管çããå Žåã¯ãæ§æãã¡ã€ã«ã䜿çšããŸãã
- ç¶æ³ã«å¿ããŠããŸããŸãªãµãŒãã¹ãç»é²ããå Žåã¯ãã³ãŒãã§ã³ã³ãããæ§æããŸãã
- ã¢ãžã¥ãŒã«ã¬ãã«ã®ãµãŒãã¹ãããå Žåã¯ãã¢ãžã¥ãŒã«ãããŒãããããšãã«ã®ã¿ç»é²ãããããã«ãã³ãŒãã䜿çšããŠã³ã³ãããæ§æããŸãã
ã泚æ
MEFãªã©ã®äžéšã®ã³ã³ããã¯ãæ§æãã¡ã€ã«ãä»ããŠæ§æã§ãããã³ãŒãã§æ§æããå¿
èŠããããŸãã
åºæ¬ã·ããªãª
ã³ã³ããã¯ãç»é²ãšèš±å¯ãšãã2ã€ã®äž»ãªç®çã«äœ¿çšãããŸãã
ç»é²
äŸåé¢ä¿ããªããžã§ã¯ãã«æ³šå
¥ããåã«ãäŸåé¢ä¿ã®çš®é¡ãã³ã³ããã«ç»é²ããå¿
èŠããããŸãã éåžžãåãç»é²ããã«ã¯ãã³ã³ããã«ã€ã³ã¿ãŒãã§ã€ã¹ãæž¡ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããç¹å®ã®åãæž¡ããŸãã ãŸãæåã«ãã¿ã€ããšãªããžã§ã¯ããç»é²ããæ¹æ³ã2ã€ãããŸãïŒã³ãŒãå
ã§ããŸãã¯æ§æãã¡ã€ã«ã䜿çšããŠã å®è£
ã®è©³çŽ°ã¯ãã³ã³ããã«ãã£ãŠç°ãªãå ŽåããããŸãã
éåžžãã³ãŒããšã³ã³ãããŒã«åãšãªããžã§ã¯ããç»é²ããã«ã¯ã2ã€ã®æ¹æ³ããããŸãã
- ã¿ã€ããç»é²ããããããã¿ã€ããå¥ã®ã¿ã€ãã«ãããã§ããŸãã é©åãªã¿ã€ãã³ã°ã§ãã³ã³ããã¯æå®ããã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
- ãªããžã§ã¯ãã®æ¢åã®ã€ã³ã¹ã¿ã³ã¹ãã·ã³ã°ã«ãã³ãšããŠç»é²ã§ããŸãã ã³ã³ããã¯ãæ¢åã®ãªããžã§ã¯ããžã®ãªã³ã¯ãè¿ããŸãã
UnityContainerã§ã®ã¿ã€ãã®ç»é²
åæåäžã«ãåã¯ãã¥ãŒããµãŒãã¹ãªã©ã®ä»ã®åãç»é²ããå ŽåããããŸãã ç»é²ã«ãããã³ã³ããã«ãã£ãŠäŸåé¢ä¿ã解決ããä»ã®ã¿ã€ãã§å©çšã§ããããã«ãªããŸãã ãããè¡ãã«ã¯ãã¢ãžã¥ãŒã«ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã³ã³ãããŒãå®è£
ããå¿
èŠããããŸãã 次ã®ã³ãŒãã¯ã
Commanding QuickStartã®
OrderModule
ããã·ã³ã°ã«ãã³ãªã©ã®åæåæã«ãªããžããªã®ã¿ã€ããç»é²ããæ¹æ³ã瀺ããŠããŸãã
public class OrderModule : IModule { public void Initialize() { this.container.RegisterType<IOrdersRepository, OrdersRepository>(new ContainerControlledLifetimeManager()); ... } ... }
䜿çšããŠããã³ã³ããã«å¿ããŠãæ§æãã¡ã€ã«ãä»ããŠã³ãŒãå€ã§ç»é²ãè¡ãããšãã§ããŸãã äŸã«ã€ããŠã¯ã第4ç« ã
ã¢ãžã¥ãŒã«åŒã¢ããªã±ãŒã·ã§ã³éçº ãã®ãæ§æãã¡ã€ã«ã䜿çšããã¢ãžã¥ãŒã«ã®ç»é²ããåç
§ããŠãã ããã
ã¿ã€ããMEFã³ã³ããã«ç»é²ãã
ã³ã³ããã«ã¿ã€ããç»é²ããããã«ãMEFã¯å±æ§ããŒã¹ã®ã·ã¹ãã ã䜿çšããŸãã ãã®çµæãã¿ã€ãç»é²ãã³ã³ããã«è¿œå ããã®ã¯éåžžã«ç°¡åã§ãããã®ããã«ã¯ã次ã®äŸã«ç€ºãããã«ãã³ã³ããã«ç»é²ããã¿ã€ãã«
[Export]
å±æ§ãè¿œå ããå¿
èŠããããŸãã
[Export(typeof(ILoggerFacade))] public class CallbackLogger: ILoggerFacade { ... }
MEFã®ãã1ã€ã®äœ¿çšäŸã¯ãã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åãããã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ãã³ã³ããã«ç»é²ããããšã§ãã
MEF QuickStartã䜿çšãã
Silverlight for Modularityã®QuickStartBootstrapperã¯ã
ConfigureContainer
ã¡ãœããã§ãã®äŸã瀺ããŠããŸãã
protected override void ConfigureContainer() { base.ConfigureContainer();
ã泚æ
MEFãã³ã³ãããšããŠäœ¿çšããå Žåãã¿ã€ããç»é²ããããã«å±æ§ã䜿çšããããšããå§ãããŸãã
èš±å¯
ã¿ã€ããç»é²ããããšãäŸåé¢ä¿ãšããŠè§£æ±ºãŸãã¯å®è£
ã§ããŸãã åã解決ãããã³ã³ããããã®åã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããå¿
èŠãããå Žåããã®ã€ã³ã¹ã¿ã³ã¹ã«äŸåé¢ä¿ã泚å
¥ããŸãã
äžè¬ã«ãåã解決ããããšã次ã®3ã€ã®ãããããçºçããŸãã
- ã¿ã€ããç»é²ãããŠããªãå Žåãã³ã³ããã¯äŸå€ãã¹ããŒããŸãã
ã泚æ
Unityãå«ãäžéšã®ã³ã³ããã§ã¯ãç»é²ãããŠããªãç¹å®ã®ã¿ã€ããèš±å¯ã§ããŸãã
- ã¿ã€ããã·ã³ã°ã«ãã³ãšããŠç»é²ãããŠããå Žåãã³ã³ããã¯ã·ã³ã°ã«ãã³ã®ã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãã ãããæåã®åŒã³åºãã§ããå Žåãã³ã³ããã¯ã€ã³ã¹ã¿ã³ã¹ãäœæããå°æ¥ã®åŒã³åºãã®ããã«ä¿åã§ããŸãã
- ã¿ã€ããã·ã³ã°ã«ãã³ãšããŠç»é²ãããŠããªãå Žåãã³ã³ããã¯æ°ããã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãã
ã泚æ
ããã©ã«ãã§ã¯ãMEFã«ç»é²ãããŠããã¿ã€ãã¯ã·ã³ã°ã«ãã³ã§ãããã³ã³ããã¯ãªããžã§ã¯ããžã®åç
§ãä¿åããŸãã Unityã§ã¯ãããã©ã«ãã§ãªããžã§ã¯ãã®æ°ããã€ã³ã¹ã¿ã³ã¹ãè¿ãããã³ã³ãããŒã¯ããããžã®åç
§ãä¿åããŸããã
ãŠããã£è§£å床
Commanding QuickStartã®æ¬¡ã®ã³ãŒãäŸã¯ã
OrdersEditorView
ããã³
OrdersToolBar
ã³ã³ãããŒããã©ã®ããã«è§£æ±ºãããããããã®é åã«ãã€ã³ãããããã瀺ããŠããŸãã
public class OrderModule : IModule { public void Initialize() { this.container.RegisterType<IOrdersRepository, OrdersRepository>(new ContainerControlledLifetimeManager());
OrdersEditorPresentationModel
ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯ã解決æã«å°å
¥ããã次ã®äŸåé¢ä¿ïŒé åºãªããžããªãšé åºã³ãã³ããããã·ïŒãå«ãŸããŸãã
public OrdersEditorPresentationModel(IOrdersRepository ordersRepository, OrdersCommandProxy commandProxy) { this.ordersRepository = ordersRepository; this.commandProxy = commandProxy;
åã®äŸã§ç€ºããããã«ãã³ã³ã¹ãã©ã¯ã¿ãŒã«åã蟌ãããšã«å ããŠãUnityã¯ããããã£ã«äŸåé¢ä¿ãåã蟌ãããšãã§ããŸãã
[Dependency]
å±æ§ãé©çšãããããããã£ã¯ããªããžã§ã¯ãã解決ããããšèªåçã«è§£æ±ºãããå®è£
ãããŸãã ããããã£ã
OptionalDependency
å±æ§ã§ããŒã¯ãããŠããå ŽåãäŸåé¢ä¿ã解決ã§ããªãå Žåãããããã£ã¯
null
èšå®ãããäŸå€ã¯ã¹ããŒãããŸããã
MEFã®ã€ã³ã¹ã¿ã³ã¹ã®è§£æ±º
MEF QuickStartã䜿çšãã
Silverlight for Modularityã® Bootstrapper
ãã·ã§ã«ã€ã³ã¹ã¿ã³ã¹ãååŸããæ¹æ³ã次ã®ã³ãŒãäŸã«ç€ºããŸãã ç¹å®ã®ã¿ã€ããèŠæ±ãã代ããã«ãã³ãŒãã¯ã€ã³ã¿ãŒãã§ãŒã¹ã®ã€ã³ã¹ã¿ã³ã¹ãèŠæ±ã§ããŸãã
protected override DependencyObject CreateShell() { return this.Container.GetExportedValue<Shell>(); }
ILoggerFacade
ããã³
IModuleTracker
ãå®è£
ããMEF QuickStartã䜿çšãã ã
ModuleA
ãã
Modularity for Silverlightãžã®æ¬¡ã®ã³ãŒãäŸã«ç€ºãããã«ãMEFãèš±å¯ããã¯ã©ã¹ã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãžã®æ³šå
¥ã䜿çšã§ããŸãã
[ImportingConstructor] public ModuleA(ILoggerFacade logger, IModuleTracker moduleTracker) { if (logger == null) { throw new ArgumentNullException("logger"); } if (moduleTracker == null) { throw new ArgumentNullException("moduleTracker"); } this.logger = logger; this.moduleTracker = moduleTracker; this.moduleTracker.RecordModuleConstructed(WellKnownModuleNames.ModuleA); }
ãŸãã¯ãåã蟌ã¿
ILoggerFacade
ã€ã³ã¹ã¿ã³ã¹ãæã€
MEF QuickStartã䜿çšãã
Modularity for Silverlightã® ModuleTracker
ã¯ã©ã¹ã«ç€ºãããã«ãããããã£ã€ã³ãžã§ã¯ã·ã§ã³ã䜿çšã§ããŸãã
[Export(typeof(IModuleTracker))] public class ModuleTracker : IModuleTracker {
ã泚æ
Silverlightã§ã¯ãã€ã³ããŒããããããããã£ãšãã£ãŒã«ãã¯ãããªãã¯ã§ããå¿
èŠããããŸãã
Prismã§äŸåé¢ä¿æ³šå
¥ã³ã³ãããŒãšãµãŒãã¹ã䜿çšãã
äŸåæ§æ³šå
¥ã³ã³ããã¯ãã³ã³ããŒãã³ãéã®äŸåé¢ä¿ãæºããããã«äœ¿çšãããŸãã ãããã®äŸåé¢ä¿ãæºããã«ã¯ãéåžžãç»é²ãšè§£æ±ºãå¿
èŠã§ãã Prismã©ã€ãã©ãªã¯ãUnityããã³MEFã³ã³ããã®ãµããŒããæäŸããŸããããããã«ã¯äŸåããŸããã ã©ã€ãã©ãªã¯
IServiceLocator
ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠã³ã³ããã«ã¢ã¯ã»ã¹ã§ãããããã³ã³ããã¯ç°¡åã«äº€æã§ããŸãã ãããè¡ãã«ã¯ã
IServiceLocator
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããå¿
èŠããããŸãã éåžžãã³ã³ããã亀æããå Žåã¯ãç¬èªã®ã³ã³ããåºæã®ããŒãããŒããŒãäœæããå¿
èŠããããŸãã
IServiceLocator
ã€ã³ã¿ãŒãã§ã€ã¹
IServiceLocator
ã
Common Service Locator Libraryã§å®çŸ©ãããŠããŸãã ããã¯ãäŸåæ§æ³šå
¥ã³ã³ãããŒããµãŒãã¹ãã±ãŒã¿ãŒãªã©ã®IoCïŒå¶åŸ¡ã®å転ïŒã³ã³ãããŒã®æœè±¡åãæäŸããããã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ãã ãã®ã©ã€ãã©ãªã䜿çšããç®çã¯ãç¹å®ã®ã³ã³ããå®è£
ãæäŸããã«ãIoCãšãµãŒãã¹ãã±ãŒã·ã§ã³ã䜿çšããããšã§ãã
Prismã©ã€ãã©ãªã¯ã
UnityServiceLocatorAdapter
ãš
MefServiceLocatorAdapter
æäŸããŸãã äž¡æ¹ã®ã¢ããã¿ãŒã¯
ISeviceLocator
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ãã
ServiceLocatorImplBase
ã¿ã€ããæ¡åŒµããŸãã 次ã®å³ã¯ãã¯ã©ã¹éå±€ã瀺ããŠããŸãã

Prismã©ã€ãã©ãªã¯ç¹å®ã®ã³ã³ãããåç
§ãŸãã¯äŸåããŸããããã¢ããªã±ãŒã·ã§ã³ãéåžžã«ç¹å®ã®DIã³ã³ããã䜿çšããã®ã¯äžè¬çã§ãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ãç¹å®ã®ã³ã³ãããåç
§ããã®ã劥åœã§ããããšãæå³ããŸãããPrismã©ã€ãã©ãªã¯ã³ã³ãããçŽæ¥åç
§ããŸããã ããšãã°ã
Stock Trader RIã¢ããªãšQuickStartsã®ããã€ãã¯ãUnityãã³ã³ãããšããŠäœ¿çšããŸãã ä»ã®äŸãšã¯ã€ãã¯ã¹ã¿ãŒãã¯MEFã䜿çšããŸãã
IServiceLocator
次ã®ã³ãŒãã¯ã
IServiceLocator
ã€ã³ã¿ãŒãã§ã€ã¹ãšãã®ã¡ãœããã瀺ããŠããŸãã
public interface IServiceLocator : IServiceProvider { object GetInstance(Type serviceType); object GetInstance(Type serviceType, string key); IEnumerable<object> GetAllInstances(Type serviceType); TService GetInstance<TService>(); TService GetInstance<TService>(string key); IEnumerable<TService> GetAllInstances<TService>(); }
Service Locatorã¯ã次ã®ã³ãŒãã«ç€ºãæ¡åŒµã¡ãœããã§Prismã©ã€ãã©ãªãè£å®ããŸãã
IServiceLocator
ãèš±å¯ã§ã¯ãªãç»é²ã«ã®ã¿äœ¿çšãããŠããããšãããããŸãã
public static class ServiceLocatorExtensions { public static object TryResolve(this IServiceLocator locator, Type type) { try { return locator.GetInstance(type); } catch (ActivationException) { return null; } } public static T TryResolve<T>(this IServiceLocator locator) where T: class { return locator.TryResolve(typeof(T)) as T; } }
Unityã³ã³ããããµããŒãããªã
TryResolve
æ¡åŒµ
TryResolve
ãç»é²ãããå Žåã«èš±å¯ããå¿
èŠãããåã®ã€ã³ã¹ã¿ã³ã¹ãè¿ã
null
ãããã§ãªãå Žåã¯
null
è¿ã
null
ã
ModuleInitializer
ã¯ã次ã®ã³ãŒãäŸã«ç€ºãããã«ã
IServiceLocator
ã䜿çšããŠãèªã¿èŸŒã¿äžã«ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ã解決ããŸãã
IModule moduleInstance = null; try { moduleInstance = this.CreateModule(moduleInfo); moduleInstance.Initialize(); } ...
protected virtual IModule CreateModule(string typeName) { Type moduleType = Type.GetType(typeName); if (moduleType == null) { throw new ModuleInitializeException(string.Format(CultureInfo.CurrentCulture, Properties.Resources.FailedToGetType, typeName)); } return (IModule)this.serviceLocator.GetInstance(moduleType); }
IServiceLocatorã®äœ¿çšã«é¢ããèæ
®äºé
IServiceLocator
ãæ±çšã³ã³ãããšããŠäœ¿çšããããšãæå³ãããã®ã§
IServiceLocator
ãŸããã ã³ã³ããã«ã¯ããŸããŸãªäœ¿çšæ¹æ³ããããå€ãã®å Žåãã³ã³ããã®éžæã«åœ±é¿ããŸãã ããã念é ã«çœ®ããŠã
Stock Trader RIã¯
IServiceLocator
ã䜿çšãã代ããã«ãäŸåé¢ä¿æ³šå
¥ã³ã³ãããŒãçŽæ¥äœ¿çšããŸãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ãéçºãããšãã«æšå¥šãããã¢ãããŒãã§ãã
次ã®ç¶æ³ã§ã¯ã
IServiceLocator
ã®äœ¿çšãé©åã§ãã
- ããªãã¯ãè€æ°ã®ã³ã³ããããµããŒãããå¿
èŠããããµãŒãããŒãã£ã®ãµãŒãã¹ãéçºããŠããç¬ç«ç³»ãœãããŠã§ã¢ãã³ããŒïŒISVïŒã§ãã
- ç°ãªãã³ã³ããã䜿çšããçµç¹ã§äœ¿çšããããµãŒãã¹ãéçºããŠããŸãã
è¿œå æ
å ±
DIã³ã³ãããŒã«é¢é£ããæ
å ±ã«ã€ããŠã¯ã以äžãåç
§ããŠãã ããã