关于MEF框架 嵌套的用法
最近才开始使用MEF框架在实际项目中应用,系本人菜鸟,在项目中遇到 部件的嵌套问题,目前的解决方式如下,已备查阅。
项目结构如下:
1.MEF接口,分为IStringManager1和IStringManager2
using System.ComponentModel.Composition; namespace Test.API { [InheritedExport] public interface IStringManager1 { string GetString(); } [InheritedExport] public interface IStringManager2 { string SetString(); } }
2.IStringManager1的部件
namespace Test.Mef1 { public class ClassA:Test.API.IStringManager1 { public string GetString() { return "test1"; } } }
3.IStringManager2的部件
using System.ComponentModel.Composition; using Test.API; namespace Test.Mef2 { public class ClassB : IStringManager2 { [Import] IStringManager1 server1 { get; set; } public ClassB() { //var catelog = new DirectoryCatalog("lib1"); //var container = new CompositionContainer(catelog); //container.ComposeParts(this); } public string SetString() { return server1.GetString(); } } }
4.在主调用程序中,仅导入部件2
[Import]
Test.API.IStringManager2 ser2 { get; set; }
但部件2又导入了部件1,为了让2个程序的实例均在主程序中被实例化,需要在主程序中分别进行组合,否则会出现未实例化部件的异常。主程序完整代码如下:
using System; using System.ComponentModel.Composition.Hosting; using System.ComponentModel.Composition; namespace Test.Mef { class Program { [Import] Test.API.IStringManager2 ser2 { get; set; } static void Main(string[] args) { try { Program p = new Program(); var catelog = new AggregateCatalog(); catelog.Catalogs.Add(new DirectoryCatalog("lib1")); catelog.Catalogs.Add(new DirectoryCatalog("lib2")); var container = new CompositionContainer(catelog); container.ComposeParts(p); Console.WriteLine(p.ser2.SetString()); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Console.Read(); } } } }
浙公网安备 33010602011771号