2014-02-09 44 views
1

我正在嘗試構建一個應用程序,該應用程序使用託管實體框架來導入未知數量的類及其相關方法。從MEF進口構建類和方法heirachy

例如我有以下2類:

interface IClass { } 

[Export(typeof(IClass))] 
class Class1 : IClass 
{ 
    [Export(typeof(Func<int>))]   
    public int GetNumber() 
    { 
     return 1; 
    } 
} 

[Export(typeof(IClass))] 
class Class2 : IClass 
{ 
    [Export(typeof(Func<int>))] 
    public int GetNumber1() 
    { 
     return 1; 
    } 

    [Export(typeof(Func<int>))] 
    public int GetNumber2() 
    { 
     return 2; 
    } 
} 

Class1具有單個GetNumber方法,同時Class2有兩個。

在我的程序中,我能夠創建加載類和方法的導入。

class Program 
{ 
    [ImportMany] 
    IEnumerable<IClass> Classes { get; set; } 

    [ImportMany(typeof(Func<int>))] 
    IEnumerable<Func<int>> Methods { get; set; } 

    static void Main(string[] args) 
    { 
     Program p = new Program(); 
     p.Run(); 
     Console.Read(); 
    } 

    void Run() 
    { 
     AssemblyCatalog catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()); 
     CompositionContainer container = new CompositionContainer(catalog); 

     container.ComposeParts(this); 

     if(this.Classes.Count() != 2) 
     { 
      throw new InvalidOperationException(); 
     } 

     this.Methods.ToList().ForEach(m => Console.WriteLine(m())); 
    } 
} 

輸出

我的問題是類和方法之間的鏈路已丟失。由於所有的類和方法都被扔進相同的IEnumerable,我不知道哪個類被鏈接到哪個方法。

我真的很想建立一個內存結構類似的模型的層次結構和方法,例如,

的Class1:GetNumber

類2:GetNumber1,GetNumber2

如何導入這些相同的類和方法,但保留類方法的鏈接?

回答

1

這可以通過使用container.GetExportedValues來實現,這將暴露類和方法。然後可以將它們分組並組成優選結構。你根本不需要[ImportMany]。這讓人感覺有點落後,因爲MEF是爲了給你演奏這個作品,但是它在這種情況下起作用。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Program p = new Program(); 
     p.Run(); 
     Console.Read(); 
    } 

    void Run() 
    { 
     AssemblyCatalog catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()); 
     CompositionContainer container = new CompositionContainer(catalog); 

     Dictionary<IClass, List<Func<int>>> dictionary = new Dictionary<IClass, List<Func<int>>>(); 

     IEnumerable<IClass> classes = container.GetExportedValues<IClass>(); 
     IEnumerable<Func<int>> methods = container.GetExportedValues<Func<int>>(); 

     foreach(var c in classes) 
     { 
      dictionary[c] = new List<Func<int>>(); 
     } 

     foreach(var m in methods) 
     { 
      dictionary[(IClass)m.Target].Add(m); 
     }    

     foreach(var kvp in dictionary) 
     { 
      kvp.Value.ForEach(m => Console.WriteLine(m())); 
     } 
    } 
} 

如果您需要使用元數據container.GetExports