MEF2.0 CodePlexにあるMEF v2ではカスタム属性ではなくコードでImport/Exportが可能になっています。 インターフェイスの定義 namespace MefSample { public interface IGreeting { void Say(string name); } } 次に、実装クラスを2つばかり。 using System; using System.ComponentModel.Composition; namespace MefSample { // [Export(typeof(IGreeting))] public class Hello : IGreeting { public void Say(string name) { Console.WriteLine(@"Hello, {0}", name); } } // [Export(typeof(IGreeting))] public class Goodby : IGreeting { public void Say(string name) { Console.WriteLine(@"Goodby, {0}", name); } } } カスタム属性がコメントアウトされていることに注意してください。 では、依存関係の解決をします。 using System.Collections.Generic; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.ComponentModel.Composition.Registration; namespace MefSample { // [Export] public class Program { // [ImportMany] public IEnumerable<IGreeting> Greetings { get; set; } public void Say() { foreach (var greeting in Greetings) greeting.Say("mei"); } static void Main(string[] args) { var registration = new RegistrationBuilder(); // Helloクラスを登録してIGreetingインタフェースをエクスポート registration.OfType<Hello>().Export<IGreeting>(); // Goodbyクラスを登録してIGreetingインタフェースをエクスポート registration.OfType<Goodby>().Export<IGreeting>(); // Programを登録し、型がIEnumerable<IGreeting>のプロパティにインポートして、Programをエクスポート // ImportManyの場合は、第二引数のdelegateでAsMany()とする必要がある registration.OfType<Program>() .ImportProperty(property => property.PropertyType == typeof (IEnumerable<IGreeting>), (p, b) => b.AsMany()) .Export<Program>(); var catalog = new AssemblyCatalog(typeof (Program).Assembly, registration); var container = new CompositionContainer(catalog); // エクスポートされているProgramを取得 var program = container.GetExportedValue<Program>(); program.Say(); } } } /* 結果 Hello, mei Goodby mei */ あなたのお住まいの地域で最安のブロードバンド選び コメント: |