Language
Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®èšäºã§ã¯ãManaged Extensibility Framework ã®æŠèŠã«ã€ããŠèª¬æããŸãã
MEF ãšã¯
Managed Extensibility Framework (MEF) ã¯ã軜éã§æ¡åŒµå¯èœãªã¢ããªã±ãŒã·ã§ã³ãäœæããããã®ã©ã€ãã©ãªã§ãã ããã«ãããã¢ããªã±ãŒã·ã§ã³éçºè ã¯ãæ§æãå¿ èŠãšãããæ¡åŒµæ©èœãæ€åºããŠäœ¿çšã§ããŸãã ãŸããæ¡åŒµæ©èœéçºè ã¯ã³ãŒããç°¡åã«ã«ãã»ã«åããè匱ãªããŒãäŸåé¢ä¿ãåé¿ããããšãã§ããŸãã MEF ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³å ã ãã§ãªããã¢ããªã±ãŒã·ã§ã³éã§ãæ¡åŒµæ©èœãåå©çšã§ããŸãã
æ¡åŒµæ§ã®åé¡
ããªãã¯ãæ¡åŒµæ§ã®ãµããŒããæäŸããå¿ èŠãããå€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã§ãããšããŸãã ã¢ããªã±ãŒã·ã§ã³ã«ã¯ã倿°ã®å°ããªã³ã³ããŒãã³ããå«ããå¿ èŠããããã³ã³ããŒãã³ãã®äœæãšå®è¡ãæ åœããŸãã
ãã®åé¡ã«å¯Ÿããæãç°¡åãªæ¹æ³ã¯ãã³ã³ããŒãã³ãããœãŒã¹ ã³ãŒããšããŠã¢ããªã±ãŒã·ã§ã³ã«å«ããã³ãŒãããçŽæ¥åŒã³åºãæ¹æ³ã§ãã ããã«ã¯ãããã€ãã®æãããªæ¬ ç¹ããããŸãã æãéèŠãªã®ã¯ããœãŒã¹ ã³ãŒãã倿Žããã«æ°ããã³ã³ããŒãã³ãã远å ã§ããªãããšã§ããããã¯ãWeb ã¢ããªã±ãŒã·ã§ã³ãªã©ã§ã¯èš±å®¹ã§ããå¶éã§ãããã¯ã©ã€ã¢ã³ã ã¢ããªã±ãŒã·ã§ã³ã§ã¯åäœããŸããã åæ§ã«åé¡ãšãªãã®ã¯ãã³ã³ããŒãã³ãããµãŒãããŒãã£ã«ããéçºãããå¯èœæ§ããããããããªãããã®ãœãŒã¹ã³ãŒãã«ã¢ã¯ã»ã¹ã§ããªãããšããããŠåãçç±ã§ããªãã圌ãã«èªåã®ã³ãŒããžã®ã¢ã¯ã»ã¹ãèš±å¯ã§ããªããšããããšã§ãã
ããå°ãé«åºŠãªã¢ãããŒãã¯ãæ¡åŒµãã€ã³ããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŠãã¢ããªã±ãŒã·ã§ã³ãšãã®ã³ã³ããŒãã³ãéã®åãé¢ããå¯èœã«ããããšã§ãã ãã®ã¢ãã«ã§ã¯ãã³ã³ããŒãã³ããå®è£ ã§ããã€ã³ã¿ãŒãã§ã€ã¹ãšãã¢ããªã±ãŒã·ã§ã³ãšã®å¯Ÿè©±ãå¯èœã«ãã API ãæäŸã§ããŸãã ããã«ããããœãŒã¹ ã³ãŒããžã®ã¢ã¯ã»ã¹ãå¿ èŠã«ãªããšããåé¡ã¯è§£æ±ºããŸãããäŸç¶ãšããŠç¬èªã®åé¡ããããŸãã
ã¢ããªã±ãŒã·ã§ã³ã«ã¯ã³ã³ããŒãã³ããåç¬ã§æ€åºããããã®å®¹éããªããããã©ã®ã³ã³ããŒãã³ãã䜿çšå¯èœã§ãããèªã¿èŸŒãããæç€ºçã«äŒããå¿ èŠããããŸãã ããã¯éåžžã䜿çšå¯èœãªã³ã³ããŒãã³ããæ§æãã¡ã€ã«ã«æç€ºçã«ç»é²ããããšã«ãã£ãŠå®çŸãããŸãã ããã¯ãã³ã³ããŒãã³ããæ£ããããšãä¿èšŒããããšãã¡ã³ããã³ã¹ã®åé¡ã«ãªãããšãæå³ããŸããç¹ã«ãæŽæ°ãè¡ãå¿ èŠãããéçºè ã§ã¯ãªãããšã³ã ãŠãŒã¶ãŒã§ããå Žåã§ãã
ããã«ãã³ã³ããŒãã³ãã¯ãã¢ããªã±ãŒã·ã§ã³èªäœã®å³å¯ã«å®çŸ©ããããã£ãã«ãä»ããå Žåãé€ããçžäºã«éä¿¡ããããšã¯ã§ããŸããã ã¢ããªã±ãŒã·ã§ã³ ã¢ãŒããã¯ããç¹å®ã®éä¿¡ã®å¿ èŠæ§ãäºæž¬ããŠããªãå Žåãéåžžã¯äžå¯èœã§ãã
æåŸã«ãã³ã³ããŒãã³ãéçºè ã¯ãå®è£ ããã€ã³ã¿ãŒãã§ã€ã¹ãå«ãŸããŠããã¢ã»ã³ããªã«å¯Ÿããå³å¯ãªäŸåé¢ä¿ãåãå ¥ããå¿ èŠããããŸãã ããã«ãããã³ã³ããŒãã³ããè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããããšãå°é£ã«ãªããã³ã³ããŒãã³ãã®ãã¹ã ãã¬ãŒã ã¯ãŒã¯ãäœæãããšãã«åé¡ãçºçããå¯èœæ§ããããŸãã
MEF ãæäŸãããã®
MEF ã¯ã䜿çšå¯èœãªã³ã³ããŒãã³ãã®æç€ºçãªç»é²ã§ã¯ãªãã ã³ã³ããžã·ã§ã³ãä»ããŠæé»çã«æ€åºããæ¹æ³ãæäŸããŸãã ããŒããšåŒã°ãã MEF ã³ã³ããŒãã³ãã¯ãäŸåé¢ä¿ (ã€ã³ããŒããšåŒã°ããŸã) ãšã䜿çšã§ããæ©èœ (ãšã¯ã¹ããŒããšåŒã°ããŸã) ã®äž¡æ¹ã宣èšã«ãã£ãŠæå®ããŸãã ããŒããäœæããããšãMEF ã³ã³ããžã·ã§ã³ ãšã³ãžã³ãä»ã®ããŒãããåŸããããã®ã䜿ã£ãŠã€ã³ããŒãèŠä»¶ãå è¶³ããŸãã
ãã®æ¹æ³ã§ã¯ãåã®ã»ã¯ã·ã§ã³ã§èª¬æããåé¡ã解決ããŸãã MEF ããŒãã¯å®£èšã«ãã£ãŠæ©èœãæå®ãããããå®è¡æã«æ€åºã§ããŸããã€ãŸããã¢ããªã±ãŒã·ã§ã³ã¯ãããŒãã³ãŒãã£ã³ã°ãããåç §ãèåŒ±ãªæ§æãã¡ã€ã«ãªãã§ããŒãã䜿çšã§ããŸãã MEF ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã¯ãã€ã³ã¹ã¿ã³ã¹åãããã¢ã»ã³ããªãèªã¿èŸŒãã ãããããšãªããã¡ã¿ããŒã¿ã«ãã£ãŠããŒããæ€åºããŠèª¿ã¹ãããšãã§ããŸãã ãã®ãããæ¡åŒµæ©èœãèªã¿èŸŒãã¿ã€ãã³ã°ã𿹿³ãæ éã«æå®ããå¿ èŠã¯ãããŸããã
æå®ããããšã¯ã¹ããŒãã«å ããŠãããŒãã¯ä»ã®ããŒãã«ãã£ãŠè£å®ãããã€ã³ããŒããæå®ã§ããŸãã ããã«ãããããŒãéã®éä¿¡ãå¯èœã«ãªãã ãã§ãªããç°¡åã«ãªããã³ãŒãã®é©åãªèŠçŽ åãå¯èœã«ãªããŸãã ããšãã°ãå€ãã®ã³ã³ããŒãã³ãã«å ±éãããµãŒãã¹ãåå¥ã®ããŒãã«çµã¿èŸŒã¿ãç°¡åã«å€æŽãŸãã¯äº€æã§ããŸãã
MEF ã¢ãã«ã§ã¯ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ ã¢ã»ã³ããªã«å¯ŸããããŒãäŸåé¢ä¿ã¯å¿ èŠãªããããã¢ããªã±ãŒã·ã§ã³éã§æ¡åŒµæ©èœãåå©çšã§ããŸãã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã«äŸåããªããã¹ãããŒãã¹ãç°¡åã«éçºããŠæ¡åŒµã³ã³ããŒãã³ãããã¹ãã§ããŸãã
MEF ã䜿çšããŠèšè¿°ãããæ¡åŒµå¯èœãªã¢ããªã±ãŒã·ã§ã³ã¯ãæ¡åŒµã³ã³ããŒãã³ãã§å ¥åã§ããã€ã³ããŒãã宣èšããã¢ããªã±ãŒã·ã§ã³ ãµãŒãã¹ãæ¡åŒµæ©èœã«å ¬éããããã«ãšã¯ã¹ããŒãã宣èšããããšãã§ããŸãã åæ¡åŒµã³ã³ããŒãã³ãã¯ãšã¯ã¹ããŒãã宣èšããã€ã³ããŒãã宣èšããããšãã§ããŸãã ããã«ãããæ¡åŒµæ©èœã³ã³ããŒãã³ãèªäœãèªåçã«æ¡åŒµãããŸãã
MEF ã䜿çšå¯èœãªå Žæ
MEF ã¯ãWindows ãã©ãŒã ãWPFããã®ä»ã®ãã¯ãããžã䜿çšããå Žåã§ããASP.NET ã䜿çšãããµãŒã㌠ã¢ããªã±ãŒã·ã§ã³ã§ããã¯ã©ã€ã¢ã³ã ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããŸãã
MEF ãš MAF
以åã®ããŒãžã§ã³ã® .NET Framework ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãæ¡åŒµæ©èœãåé¢ããã³ç®¡çã§ããããã«èšèšããããããŒãžã ã¢ãã€ã³ ãã¬ãŒã ã¯ãŒã¯ (MAF) ãå°å ¥ãããŸããã MAF ã®çŠç¹ã¯ MEF ãããè¥å¹²é«ããæ¡åŒµæ©èœã®åé¢ãšã¢ã»ã³ããªã®èªã¿èŸŒã¿ãšã¢ã³ããŒãã«éç¹ã眮ããŠããŸãããMEF ã®çŠç¹ã¯æ€åºå¯èœæ§ãæ¡åŒµæ§ãç§»æ€æ§ã§ãã 2 ã€ã®ãã¬ãŒã ã¯ãŒã¯ã¯ã¹ã ãŒãºã«çžäºéçšã§ãã1 ã€ã®ã¢ããªã±ãŒã·ã§ã³ã§äž¡æ¹ãå©çšã§ããŸãã
SimpleCalculator: ã¢ããªã±ãŒã·ã§ã³ã®äŸ
MEF ã§ã§ããããšã確èªããæãç°¡åãªæ¹æ³ã¯ãåçŽãª MEF ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšã§ãã ãã®äŸã§ã¯ãSimpleCalculator ãšããååã®éåžžã«åçŽãªé»åãäœæããŸãã SimpleCalculator ã®ç®çã¯ã"5+3" ãŸã㯠"6-2" ã®åœ¢åŒã§åºæ¬çãªç®è¡ã³ãã³ããåãå ¥ããæ£ããåçãè¿ãã³ã³ãœãŒã« ã¢ããªã±ãŒã·ã§ã³ãäœæããããšã§ãã MEF ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ ã³ãŒãã倿Žããã«æ°ããæŒç®åã远å ã§ããŸãã
ãã®äŸã®å®å šãªã³ãŒããããŠã³ããŒãããã«ã¯ãSimpleCalculator ãµã³ãã« (Visual Basic)ãåç §ããŠãã ããã
泚
SimpleCalculator ã®ç®çã¯ãMEF ã®æŠå¿µãšæ§æã瀺ãã®ã§ã¯ãªããå¿ ããããã®äœ¿çšã®ããã®çŸå®çãªã·ããªãªãæäŸããããšã§ãã MEF ã®æ©èœããæãã¡ãªãããåŸãããã¢ããªã±ãŒã·ã§ã³ã®å€ãã¯ãSimpleCalculator ãããè€éã§ãã ããåºç¯ãªäŸã«ã€ããŠã¯ãGitHubã® Managed Extensibility Framework ãåç §ããŠãã ããã
éå§ããã«ã¯ãVisual Studioã§æ°ããã³ã³ãœãŒã« ã¢ããªã±ãŒã·ã§ã³ ãããžã§ã¯ããäœæãã
SimpleCalculatorãšããååãä»ããŸããMEF ãååšãã
System.ComponentModel.Compositionã¢ã»ã³ããªãžã®åç §ã远å ããŸããModule1.vbãŸãã¯Program.csãéãã
Importsãšusingã®System.ComponentModel.CompositionãŸãã¯System.ComponentModel.Composition.Hostingãã£ã¬ã¯ãã£ãã远å ããŸãã ããã 2 ã€ã®åå空éã«ã¯ãæ¡åŒµå¯èœãªã¢ããªã±ãŒã·ã§ã³ãéçºããããã«å¿ èŠãª MEF åãå«ãŸããŠããŸããVisual Basicã䜿çšããŠããå Žåã¯ã
Publicã¢ãžã¥ãŒã«ã宣èšããè¡ã«Module1ããŒã¯ãŒãã远å ããŸãã
åæã³ã³ãããŒãšã«ã¿ãã°
MEF ã³ã³ããžã·ã§ã³ ã¢ãã«ã®äžæ žãšãªãã®ãã³ã³ ããžã·ã§ã³ ã³ã³ãããŒã§ãããã®ã³ã³ãããŒã«ã¯ã䜿çšå¯èœãªãã¹ãŠã®ããŒããå«ãŸããåæãå®è¡ãããŸãã ã³ã³ããžã·ã§ã³ã¯ãã€ã³ããŒããšãšã¯ã¹ããŒãã®ãããã³ã°ã§ãã æãäžè¬çãªçš®é¡ã®ã³ã³ããžã·ã§ã³ ã³ã³ãããŒã¯ CompositionContainerã§ãããããã SimpleCalculator ã«äœ¿çšããŸãã
Visual Basicã䜿çšããŠããå Žåã¯ãProgram ã« ãšããååã®ãããªã㯠ã¯ã©ã¹ã远å ããŸãã
Module1.vbãŸãã¯Program.csã® Program ã¯ã©ã¹ã«æ¬¡ ã® è¡ ã远å ããŸãã
Dim _container As CompositionContainer
private CompositionContainer _container;
䜿çšå¯èœãªããŒããæ€åºããããã«ãã³ã³ããžã·ã§ã³ ã³ã³ãããŒã¯ã«ã¿ãã°ãäœ¿çš ããŸãã ã«ã¿ãã°ã¯ããããœãŒã¹ãã䜿çšå¯èœãªããŒããæ€åºãããªããžã§ã¯ãã§ãã MEF ã«ã¯ãæå®ãããåãã¢ã»ã³ããªããŸãã¯ãã£ã¬ã¯ããªããããŒããæ€åºããããã®ã«ã¿ãã°ãçšæãããŠããŸãã ã¢ããªã±ãŒã·ã§ã³éçºè ã¯ãWeb ãµãŒãã¹ãªã©ã®ä»ã®ãœãŒã¹ããããŒããæ€åºããæ°ããã«ã¿ãã°ãç°¡åã«äœæã§ããŸãã
Program ã¯ã©ã¹ã«æ¬¡ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã远å ããŸãã
Public Sub New()
' An aggregate catalog that combines multiple catalogs.
Dim catalog = New AggregateCatalog()
' Adds all the parts found in the same assembly as the Program class.
catalog.Catalogs.Add(New AssemblyCatalog(GetType(Program).Assembly))
' Create the CompositionContainer with the parts in the catalog.
_container = New CompositionContainer(catalog)
' Fill the imports of this object.
Try
_container.ComposeParts(Me)
Catch ex As CompositionException
Console.WriteLine(ex.ToString)
End Try
End Sub
private Program()
{
try
{
// An aggregate catalog that combines multiple catalogs.
var catalog = new AggregateCatalog();
// Adds all the parts found in the same assembly as the Program class.
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
// Create the CompositionContainer with the parts in the catalog.
_container = new CompositionContainer(catalog);
_container.ComposeParts(this);
}
catch (CompositionException compositionException)
{
Console.WriteLine(compositionException.ToString());
}
}
ComposePartsã®åŒã³åºãã¯ãã³ã³ããžã·ã§ã³ ã³ã³ãããŒã«å¯ŸããŠãç¹å®ã®ããŒã ã»ãã (ãã®å Žå㯠Program ã®çŸåšã®ã€ã³ã¹ã¿ã³ã¹) ãæ§æããããã«æç€ºããŸãã ãã ãããã®æç¹ã§ã¯ãProgram ã«æºããå¿
èŠã®ããã€ã³ããŒãããªããããäœãå®è¡ãããŸããã
屿§ã䜿çšããã€ã³ããŒããšãšã¯ã¹ããŒã
ãŸããé»åãã€ã³ããŒã Program ã ããã«ããã Programã«å
¥ãã³ã³ãœãŒã«ã®å
¥åãåºåãªã©ã®ãŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ã®åé¡ãé»åã®ããžãã¯ããåé¢ã§ããŸãã
以äžã®ã³ãŒãã Program ã¯ã©ã¹ã«è¿œå ããŸãã
<Import(GetType(ICalculator))>
Public Property calculator As ICalculator
[Import(typeof(ICalculator))]
public ICalculator calculator;
calculator ãªããžã§ã¯ãã®å®£èšã¯çããããšã§ã¯ãããŸããããImportAttribute屿§ã§ä¿®é£ŸãããŠããããšã«æ³šæããŠãã ããã ãã®å±æ§ã¯ãã€ã³ããŒããšããŠå±æ§ã宣èšããŸããã€ãŸãããªããžã§ã¯ããæ§æããããšãã«ãã³ã³ããžã·ã§ã³ ãšã³ãžã³ã«ãã£ãŠèšå®ãããŸãã
ãã¹ãŠã®ã€ã³ããŒãã«ã¯ ã³ã³ãã©ã¯ãããããã©ã®ãšã¯ã¹ããŒããšäžèŽããããæ±ºå®ããŸãã ã³ã³ãã©ã¯ãã¯ãæç€ºçã«æå®ãããæååã«ããããšããç¹å®ã®åãã MEF ã«ãã£ãŠèªåçã«çæããããšãã§ããŸãããã®å Žåãã€ã³ã¿ãŒãã§ã€ã¹ ICalculatorã äžèŽããã³ã³ãã©ã¯ãã§å®£èšããããšã¯ã¹ããŒãã¯ããã®ã€ã³ããŒããæºãããŸãã
calculator ãªããžã§ã¯ãã®åãå®éã«ã¯ ICalculator ã§ããããšãèæ
®ããŠãã ããããã ãããããå¿
é ã§ããããã§ã¯ãããŸããã ã³ã³ãã©ã¯ãã¯ãã€ã³ããŒããããªããžã§ã¯ãã®åããç¬ç«ããŠããŸãã (ãã®å Žåã¯ã typeof(ICalculator)ãé€å€ã§ããŸããMEF ã§ã¯ãæç€ºçã«æå®ããªãéããã€ã³ããŒãã®çš®é¡ã«åºã¥ããŠã³ã³ãã©ã¯ããèªåçã«æ³å®ãããŸã)ã
ãã®éåžžã«åçŽãªã€ã³ã¿ãŒãã§ã€ã¹ãã¢ãžã¥ãŒã«ãŸã㯠SimpleCalculator åå空éã«è¿œå ããŸãã
Public Interface ICalculator
Function Calculate(input As String) As String
End Interface
public interface ICalculator
{
string Calculate(string input);
}
ICalculatorãå®çŸ©ãããããããå®è£
ããã¯ã©ã¹ãå¿
èŠã«ãªããŸãã ã¢ãžã¥ãŒã«ãŸãã¯åå空éã«æ¬¡ã®ã¯ã©ã¹ SimpleCalculator 远å ããŸãã
<Export(GetType(ICalculator))>
Public Class MySimpleCalculator
Implements ICalculator
End Class
[Export(typeof(ICalculator))]
class MySimpleCalculator : ICalculator
{
}
Programã®ã€ã³ããŒããšäžèŽãããšã¯ã¹ããŒããæ¬¡ã«ç€ºããŸãã ãšã¯ã¹ããŒããã€ã³ããŒããšäžèŽããããã«ã¯ããšã¯ã¹ããŒãã«åãã³ã³ãã©ã¯ããå¿
èŠã§ãã
typeof(MySimpleCalculator)ã«åºã¥ããŠã³ã³ãã©ã¯ãã®äžã§ãšã¯ã¹ããŒããããšäžäžèŽãçºçããã€ã³ããŒãã¯æºããããŸãããã³ã³ãã©ã¯ãã¯æ£ç¢ºã«äžèŽããå¿
èŠããããŸãã
ã³ã³ããžã·ã§ã³ ã³ã³ãããŒã«ã¯ããã®ã¢ã»ã³ããªã§äœ¿çšå¯èœãªãã¹ãŠã®ããŒããèšå®ãããããã MySimpleCalculator ããŒãã䜿çšå¯èœã«ãªããŸãã
Programã®ã³ã³ã¹ãã©ã¯ã¿ãŒãProgram ãªããžã§ã¯ãã«å¯ŸããŠã³ã³ããžã·ã§ã³ãå®è¡ãããšããã®ã€ã³ããŒãã«ã¯ MySimpleCalculator ãªããžã§ã¯ããæ ŒçŽããããã®ç®çã®ããã«äœæãããŸãã
ãŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ ã¬ã€ã€ãŒ (Program) ã¯ãä»ã®æ
å ±ãç¥ãå¿
èŠã¯ãããŸããã ãã®ããã Main ã¡ãœããã®æ®ãã®ãŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ ããžãã¯ãå
¥åã§ããŸãã
Main ã¡ãœããã«æ¬¡ã®ã³ãŒãã远å ããŸãã
Sub Main()
' Composition is performed in the constructor.
Dim p As New Program()
Dim s As String
Console.WriteLine("Enter Command:")
While (True)
s = Console.ReadLine()
Console.WriteLine(p.calculator.Calculate(s))
End While
End Sub
static void Main(string[] args)
{
// Composition is performed in the constructor.
var p = new Program();
Console.WriteLine("Enter Command:");
while (true)
{
string s = Console.ReadLine();
Console.WriteLine(p.calculator.Calculate(s));
}
}
ãã®ã³ãŒãã¯ãåã«å
¥åè¡ãèªã¿åããçµæã«Calculateã®ICalculator颿°ãåŒã³åºããŸãããã®é¢æ°ã¯ã³ã³ãœãŒã«ã«æžãæ»ãããŸãã ããã¯ã Programã§å¿
èŠãªãã¹ãŠã®ã³ãŒãã§ãã æ®ãã®äœæ¥ã¯ãã¹ãŠããŒãã§è¡ãããŸãã
ã€ã³ããŒããš ImportMany 屿§
SimpleCalculator ãæ¡åŒµå¯èœã«ããã«ã¯ãæäœã®äžèЧãã€ã³ããŒãããå¿ èŠããããŸãã éåžžã® ImportAttribute 屿§ã¯ã1 ã€ã ãã® ExportAttributeã§å¡ãã€ã¶ãããŸãã è€æ°ã®ã³ã³ããžã·ã§ã³ãšã³ãžã³ãå©çšå¯èœãªå Žåã¯ããšã©ãŒãçºçããŸãã ä»»æã®æ°ã®ãšã¯ã¹ããŒãã§å ¥åã§ããã€ã³ããŒããäœæããã«ã¯ã ImportManyAttribute 屿§ã䜿çšã§ããŸãã
MySimpleCalculator ã¯ã©ã¹ã«æ¬¡ã® operations ããããã£ã远å ããŸãã
<ImportMany()>
Public Property operations As IEnumerable(Of Lazy(Of IOperation, IOperationData))
[ImportMany]
IEnumerable<Lazy<IOperation, IOperationData>> operations;
Lazy<T,TMetadata> ã¯ããšã¯ã¹ããŒããžã®éæ¥åç
§ãä¿æããããã« MEF ã«ãã£ãŠæäŸãããåã§ãã ããã§ã¯ããšã¯ã¹ããŒãããããªããžã§ã¯ãèªäœã«å ããŠã ãšã¯ã¹ããŒãã¡ã¿ããŒã¿ããŸãã¯ãšã¯ã¹ããŒãããããªããžã§ã¯ããèšè¿°ããæ
å ±ãååŸããŸãã å Lazy<T,TMetadata> ã«ã¯ãå®éã®æäœã衚ã IOperation ãªããžã§ã¯ããšããã®ã¡ã¿ããŒã¿ã衚ã IOperationData ãªããžã§ã¯ããå«ãŸããŠããŸãã
次ã®åçŽãªã€ã³ã¿ãŒãã§ã€ã¹ãã¢ãžã¥ãŒã«ãŸã㯠SimpleCalculator åå空éã«è¿œå ããŸãã
Public Interface IOperation
Function Operate(left As Integer, right As Integer) As Integer
End Interface
Public Interface IOperationData
ReadOnly Property Symbol As Char
End Interface
public interface IOperation
{
int Operate(int left, int right);
}
public interface IOperationData
{
char Symbol { get; }
}
ãã®å Žåãåæäœã®ã¡ã¿ããŒã¿ã¯ã+ã-ã*ãªã©ããã®æäœã衚ãã·ã³ãã«ã§ãã è¿œå æäœã䜿çšã§ããããã«ããã«ã¯ãã¢ãžã¥ãŒã«ãŸãã¯åå空éã«æ¬¡ã®ã¯ã©ã¹ SimpleCalculator 远å ããŸãã
<Export(GetType(IOperation))>
<ExportMetadata("Symbol", "+"c)>
Public Class Add
Implements IOperation
Public Function Operate(left As Integer, right As Integer) As Integer Implements IOperation.Operate
Return left + right
End Function
End Class
[Export(typeof(IOperation))]
[ExportMetadata("Symbol", '+')]
class Add: IOperation
{
public int Operate(int left, int right)
{
return left + right;
}
}
ExportAttribute屿§ã¯ãåãšåãããã«æ©èœããŸãã
ExportMetadataAttribute屿§ã¯ãååãšå€ã®ãã¢ã®åœ¢åŒã§ã¡ã¿ããŒã¿ããšã¯ã¹ããŒãã«ã¢ã¿ããããŸãã
Add ã¯ã©ã¹ã¯IOperationãå®è£
ããŸãããIOperationDataãå®è£
ããã¯ã©ã¹ã¯æç€ºçã«å®çŸ©ãããŠããŸããã 代ããã«ãæå®ãããã¡ã¿ããŒã¿ã®ååã«åºã¥ãããããã£ã䜿çšããŠãMEF ã«ãã£ãŠã¯ã©ã¹ãæé»çã«äœæãããŸãã (ããã¯ãMEF ã®ã¡ã¿ããŒã¿ã«ã¢ã¯ã»ã¹ããããã€ãã®æ¹æ³ã® 1 ã€ã§ã)ã
MEF ã§ã®ã³ã³ããžã·ã§ã³ã¯ ååž°çã§ãã
Program ãªããžã§ã¯ããæç€ºçã«äœæããŸããããã®ãªããžã§ã¯ãã¯ãICalculatoråã§ããããšã倿ããMySimpleCalculatorãã€ã³ããŒãããŸããã
MySimpleCalculator次ã«ãIOperation ãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãã€ã³ããŒãããŸãããã®ã€ã³ããŒãã¯ãMySimpleCalculatorã®ã€ã³ããŒããšåæã«ãProgramã®äœææã«å
¥åãããŸãã
Add ã¯ã©ã¹ãããã«å¥ã®ã€ã³ããŒãã宣èšããŠããå Žåã¯ããã®ã€ã³ããŒããæºããããå¿
èŠãããã宣èšãããŠããã€ã³ããŒãããšã«ãããç¹°ãè¿ãããŸãã ã€ã³ããŒããæªå®äºã®å Žåãåæãšã©ãŒãçºçããŸãã (ãã ããã€ã³ããŒããçç¥å¯èœãšããŠå®£èšããããæ¢å®å€ãå²ãåœãŠããããããšã¯ã§ããŸã)ã
é»åããžãã¯
ãããã®éšåãé
眮ãããšãæ®ã£ãŠããã®ã¯é»åããžãã¯èªäœã®ã¿ã§ãã
MySimpleCalculator ã¡ãœãããå®è£
ããããã«ãCalculate ã¯ã©ã¹ã«æ¬¡ã®ã³ãŒãã远å ããŸãã
Public Function Calculate(input As String) As String Implements ICalculator.Calculate
Dim left, right As Integer
Dim operation As Char
' Finds the operator.
Dim fn = FindFirstNonDigit(input)
If fn < 0 Then
Return "Could not parse command."
End If
operation = input(fn)
Try
' Separate out the operands.
left = Integer.Parse(input.Substring(0, fn))
right = Integer.Parse(input.Substring(fn + 1))
Catch ex As Exception
Return "Could not parse command."
End Try
For Each i As Lazy(Of IOperation, IOperationData) In operations
If i.Metadata.symbol = operation Then
Return i.Value.Operate(left, right).ToString()
End If
Next
Return "Operation not found!"
End Function
public String Calculate(string input)
{
int left;
int right;
char operation;
// Finds the operator.
int fn = FindFirstNonDigit(input);
if (fn < 0) return "Could not parse command.";
try
{
// Separate out the operands.
left = int.Parse(input.Substring(0, fn));
right = int.Parse(input.Substring(fn + 1));
}
catch
{
return "Could not parse command.";
}
operation = input[fn];
foreach (Lazy<IOperation, IOperationData> i in operations)
{
if (i.Metadata.Symbol.Equals(operation))
{
return i.Value.Operate(left, right).ToString();
}
}
return "Operation Not Found!";
}
æåã®æé ã§ã¯ãå
¥åæååãå·Šå³ã®ãªãã©ã³ããšæŒç®åæåã«è§£æããŸãã
foreach ã«ãŒãã§ã¯ãoperations ã³ã¬ã¯ã·ã§ã³ã®ãã¹ãŠã®ã¡ã³ããŒãæ€æ»ãããŸãã ãããã®ãªããžã§ã¯ã㯠Lazy<T,TMetadata>åã§ãããã¡ã¿ããŒã¿å€ãšãšã¯ã¹ããŒãããããªããžã§ã¯ãã«ã¯ããããã Metadata ããããã£ãš Value ããããã£ã䜿çšããŠã¢ã¯ã»ã¹ã§ããŸãã ãã®å ŽåãSymbol ãªããžã§ã¯ãã®IOperationData ããããã£ãäžèŽããŠããããšãæ€åºãããå Žåãèšç®ããŒã«ã¯Operate ãªããžã§ã¯ãã®IOperation ã¡ãœãããåŒã³åºããŠçµæãè¿ããŸãã
é»åãå®äºããã«ã¯ãæååå
ã®æåã®æ°å以å€ã®æåã®äœçœ®ãè¿ããã«ã㌠ã¡ãœãããå¿
èŠã§ãã
MySimpleCalculator ã¯ã©ã¹ã«æ¬¡ã®ãã«ã㌠ã¡ãœããã远å ããŸãã
Private Function FindFirstNonDigit(s As String) As Integer
For i = 0 To s.Length - 1
If Not Char.IsDigit(s(i)) Then Return i
Next
Return -1
End Function
private int FindFirstNonDigit(string s)
{
for (int i = 0; i < s.Length; i++)
{
if (!char.IsDigit(s[i])) return i;
}
return -1;
}
ããã§ããããžã§ã¯ããã³ã³ãã€ã«ããŠå®è¡ã§ããããã«ãªããŸãã Visual Basicã§ãPublic ããŒã¯ãŒãã Module1 ã«è¿œå ããããšã確èªããŸãã ã³ã³ãœãŒã« ãŠã£ã³ããŠã§ã"5+3" ãªã©ã®è¿œå æäœãå
¥åãããšãèšç®ããŒã«ã«ãã£ãŠçµæãè¿ãããŸãã ãã®ä»ã®æŒç®åã§ã¯ã"Operation Not Found!" ã¡ãã»ãŒãžã衚瀺ãããŸãã
æ°ããã¯ã©ã¹ã䜿çšã㊠SimpleCalculator ãæ¡åŒµãã
é»åãåäœããããã«ãªã£ãã®ã§ãæ°ããæäœã远å ããã®ã¯ç°¡åã§ãã ã¢ãžã¥ãŒã«ãŸãã¯åå空éã«æ¬¡ã®ã¯ã©ã¹ SimpleCalculator 远å ããŸãã
<Export(GetType(IOperation))>
<ExportMetadata("Symbol", "-"c)>
Public Class Subtract
Implements IOperation
Public Function Operate(left As Integer, right As Integer) As Integer Implements IOperation.Operate
Return left - right
End Function
End Class
[Export(typeof(IOperation))]
[ExportMetadata("Symbol", '-')]
class Subtract : IOperation
{
public int Operate(int left, int right)
{
return left - right;
}
}
ãããžã§ã¯ããã³ã³ãã€ã«ããŠå®è¡ããŸãã æžç®æŒç® ("5-3" ãªã©) ãå ¥åããŸãã é»åã§æžç®ãšå ç®ããµããŒããããããã«ãªããŸããã
æ°ããã¢ã»ã³ããªã䜿çšã㊠SimpleCalculator ãæ¡åŒµãã
ãœãŒã¹ ã³ãŒããžã®ã¯ã©ã¹ã®è¿œå ã¯ç°¡åã§ãããMEF ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ç¬èªã®ãœãŒã¹ã®å€éšã§ããŒããæ¢ãæ©èœãæäŸãããŸãã ããã瀺ãã«ã¯ãsimpleCalculator ã倿ŽããŠã DirectoryCatalogã远å ããŠããã£ã¬ã¯ããªã ãã§ãªããããŒãçšã®ç¬èªã®ã¢ã»ã³ããªãæ€çŽ¢ããå¿ èŠããããŸãã
simpleCalculator ãããžã§ã¯ãã« Extensions ãšããååã®æ°ãããã£ã¬ã¯ããªã远å ããŸãã ãœãªã¥ãŒã·ã§ã³ ã¬ãã«ã§ã¯ãªãããããžã§ã¯ã ã¬ãã«ã§è¿œå ããŠãã ããã æ¬¡ã«ã ExtendedOperationsãšããååã®æ°ããã¯ã©ã¹ ã©ã€ãã©ãª ãããžã§ã¯ãããœãªã¥ãŒã·ã§ã³ã«è¿œå ããŸãã æ°ãããããžã§ã¯ãã¯ãå¥ã®ã¢ã»ã³ããªã«ã³ã³ãã€ã«ãããŸãã
ExtendedOperations ãããžã§ã¯ãã®ãããžã§ã¯ãããããã£ãã¶ã€ããŒãéãã[ã³ã³ãã€ã«] ã¿ããŸã㯠[ãã«ã] ã¿ããã¯ãªãã¯ããŸããæ¬¡ã«ããã«ãåºåãã¹ãŸãã¯åºåãã¹ã倿ŽããSimpleCalculator ãããžã§ã¯ããã£ã¬ã¯ã㪠(..\SimpleCalculator\Extensions\) å ã® Extensions ãã£ã¬ã¯ããªãæãããã«ããŸãã
Module1.vbãŸãã¯Program.csã§ãProgram ã³ã³ã¹ãã©ã¯ã¿ãŒã«æ¬¡ã®è¡ã远å ããŸãã
catalog.Catalogs.Add(
New DirectoryCatalog(
"C:\SimpleCalculator\SimpleCalculator\Extensions"))
catalog.Catalogs.Add(
new DirectoryCatalog(
"C:\\SimpleCalculator\\SimpleCalculator\\Extensions"));
äŸã®ãã¹ã Extensions ãã£ã¬ã¯ããªãžã®ãã¹ã«çœ®ãæããŸãã (ãã®çµ¶å¯Ÿãã¹ã¯ãããã°ã®ã¿ãç®çãšããŠããŸããéçšã¢ããªã±ãŒã·ã§ã³ã§ã¯ãçžå¯Ÿãã¹ã䜿çšããŸã)ãããã§ã DirectoryCatalog 㯠Extensions ãã£ã¬ã¯ããªå ã®ã¢ã»ã³ããªå ã«ããããŒããã³ã³ããžã·ã§ã³ ã³ã³ãããŒã«è¿œå ããŸãã
ExtendedOperations ãããžã§ã¯ãã§ãSimpleCalculatorãšSystem.ComponentModel.Compositionãžã®åç
§ã远å ããŸãã
ExtendedOperations ã¯ã©ã¹ ãã¡ã€ã«ã§ãImports ã®ããã« using ãŸã㯠System.ComponentModel.Composition ãã£ã¬ã¯ãã£ãã远å ããŸãã Visual Basic ã§ã¯ãImports ã®ããã® SimpleCalculator ã¹ããŒãã¡ã³ãã远å ããŸãã æ¬¡ã«ã次ã®ã¯ã©ã¹ã ExtendedOperations ã¯ã©ã¹ ãã¡ã€ã«ã«è¿œå ããŸãã
<Export(GetType(SimpleCalculator.IOperation))>
<ExportMetadata("Symbol", "%"c)>
Public Class Modulo
Implements IOperation
Public Function Operate(left As Integer, right As Integer) As Integer Implements IOperation.Operate
Return left Mod right
End Function
End Class
[Export(typeof(SimpleCalculator.IOperation))]
[ExportMetadata("Symbol", '%')]
public class Mod : SimpleCalculator.IOperation
{
public int Operate(int left, int right)
{
return left % right;
}
}
ã³ã³ãã©ã¯ããäžèŽããããã«ã¯ã ExportAttribute 屿§ã®åã ImportAttributeãšåãã§ããå¿ èŠãããããšã«æ³šæããŠãã ããã
ãããžã§ã¯ããã³ã³ãã€ã«ããŠå®è¡ããŸãã æ°ãã Mod (%) æŒç®åããã¹ãããŸãã
çµè«
ãã®ãããã¯ã§ã¯ãMEF ã®åºæ¬çãªæŠå¿µã«ã€ããŠèª¬æããŸããã
ããŒããã«ã¿ãã°ãããã³ã³ã³ããžã·ã§ã³ ã³ã³ãããŒ
ããŒããšã³ã³ããžã·ã§ã³ ã³ã³ãããŒã¯ãMEF ã¢ããªã±ãŒã·ã§ã³ã®åºæ¬çãªæ§æèŠçŽ ã§ãã ããŒãã¯ãããèªäœãŸã§ã® (èªèº«ãå«ã) å€ãã€ã³ããŒããŸãã¯ãšã¯ã¹ããŒããããªããžã§ã¯ãã§ãã ã«ã¿ãã°ã¯ãç¹å®ã®ãœãŒã¹ããã®ããŒãã®ã³ã¬ã¯ã·ã§ã³ãæäŸããŸãã ã³ã³ããžã·ã§ã³ ã³ã³ãããŒã¯ãã«ã¿ãã°ã«ãã£ãŠæäŸãããããŒãã䜿çšããŠããšã¯ã¹ããŒããžã®ã€ã³ããŒãã®ãã€ã³ãã§ããã³ã³ããžã·ã§ã³ãå®è¡ããŸãã
ã€ã³ããŒããšãšã¯ã¹ããŒã
ã€ã³ããŒããšãšã¯ã¹ããŒãã¯ãã³ã³ããŒãã³ããéä¿¡ããæ¹æ³ã§ãã ã€ã³ããŒãã§ã¯ãã³ã³ããŒãã³ãã¯ç¹å®ã®å€ãŸãã¯ãªããžã§ã¯ãã®å¿ èŠæ§ãæå®ãããšã¯ã¹ããŒãã§ã¯å€ã®å¯çšæ§ãæå®ããŸãã åã€ã³ããŒãã¯ãã³ã³ãã©ã¯ãã䜿çšããŠãšã¯ã¹ããŒãã®äžèЧãšç §åãããŸãã
次ã®ã¹ããã
ãã®äŸã®å®å šãªã³ãŒããããŠã³ããŒãããã«ã¯ãSimpleCalculator ãµã³ãã« (Visual Basic)ãåç §ããŠãã ããã
詳现ãšã³ãŒãäŸã«ã€ããŠã¯ãã Managed Extensibility Frameworkããåç §ããŠãã ããã MEF åã®äžèЧã«ã€ããŠã¯ã System.ComponentModel.Composition åå空éãåç §ããŠãã ããã