MEFã§ãªã¼ãã³ã¸ã§ããªãã¯åãã¨ã¯ã¹ãã¼ã
MefContribã«ã¯ã¸ã§ããªãã¯ç¨ã®GenericCatalogã¯ã©ã¹ãããã¾ããããã使ãã¨ãªã¼ãã³ã¸ã§ããªãã¯åãã¨ã¯ã¹ãã¼ããããã¨ãã§ãã¾ãããã ãããã¥ã¡ã³ãä¸è¶³ãªä¸ã«ãã¡ãã£ã¨çãããããã§ãã
å ¬éããã¤ã³ã¿ãã§ã¼ã¹ã¯ããããªæãã§ãã
// ãã®ã¤ã³ã¿ãã§ã¼ã¹ããç¶æ¿ããã¯ã©ã¹ã¯ãã¹ã¦ã¨ã¯ã¹ãã¼ãããã [InheritedExport] public interface ICalc<T> { T Add(T x, T y); T Div(T x, T y); }
è²ã 試ããéãã§ã¯ãå®è£ ã¯ã©ã¹ã«Export屿§ãä»ãã¦ããã¾ãããããã¤ã³ã¿ãã§ã¼ã¹ã«InheritedExport屿§ãä»ããå¿ è¦ãããã¾ãããã¨ããããããªã¼ãã³ã¸ã§ããªãã¯åãã¨ã¯ã¹ãã¼ãããå ´åã¯ãã¤ã³ã¿ãã§ã¼ã¹ã«InheritedExport屿§ãä»ãã¾ãããã
å®è£ ã¯é©å½ã«ã
// ãã®ã¨ã¯ã¹ãã¼ãã¯çºè¦ãããªãã // ãããä¸ã®ãµã³ãã«ãè¦ãéããã§ããããªãã ãã©ã»ã»ã» // [Export(typeof(ICalc<>))] public class CalcImpl<T> : ICalc<T> { public T Add(T x, T y) { return (dynamic)x + y; } public T Div(T x, T y) { return (dynamic)x / y; } }
ãã¹ããªã®ã§dynamicã使ã£ã¦ãã¾ããã¦ããã¾ãã
次ã«ã¸ã§ããªãã¯ã¤ã³ã¿ãã§ã¼ã¹ã¨å®è£ ã¯ã©ã¹ã®ãããã³ã°ãå®ç¾©ããã¯ã©ã¹ãç¨æãã¾ããGenericCatalogã«ãã®ã¯ã©ã¹ã渡ããã¨ã§åã解決ã§ããããã«ãªãããã§ãã
/// <summary> /// open genericã®å ´åãå®è£ ã¯ã©ã¹ã¨ã®ãããã³ã°ãæå®ããå¿ è¦ãããã /// </summary> [Export(typeof(IGenericContractRegistry))] public class MyGenericContractRegistry : GenericContractRegistryBase { protected override void Initialize() { Register(typeof(ICalc<>), typeof(CalcImpl<>)); } }
æºåãã§ããã®ã§ããã£ãã使ã£ã¦ã¿ã¾ãããã
[Export] class Program { [Import] public ICalc<int> CalcInt32 { get; set; } [Import] public ICalc<double> CalcDouble { get; set; } public void Run() { int x = 1, y = 2; Console.WriteLine("{0} / {1} = {2}", x, y, CalcInt32.Div(x, y)); Console.WriteLine("{0} / {1} = {2}", x, y, CalcDouble.Div(x, y)); } static void Main(string[] args) { var catalog = new TypeCatalog(typeof (Program)); var generic = new GenericCatalog(catalog, new MyGenericContractRegistry()); var container = new CompositionContainer(generic); var program = container.GetExportedValue<Program>(); program.Run(); } } /* çµæ 1 / 2 = 0 1 / 2 = 0.5 */
CodePlexã®ãã©ã¼ã©ã ãããã°ã«ãã£ããµã³ãã«ãä»ã®MefContribã ã¨åããªãã®ã§è©¦è¡é¯èª¤ã«ãªãã¾ããããå¤åããããªæãã(^^;