2012-02-01 46 views
0

從導入的屬性中檢索信息時遇到問題。在調用.ComposeParts()後,該屬性保持爲空,但組成正常,因爲之後我可以調用.GetExportedValues(),並獲取所需的實例。下面是代碼:MEF屬性注入不會發生

引導程序做組合物

[Export] 
public class Bootstrapper 
{ 
    public void Run() 
    { 
     doComposition(); 
    } 

    private void doComposition() 
    { 
     var catalog = new AggregateCatalog(); 

     catalog.Catalogs.Add(new DirectoryCatalog("./Applications")); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(Loader).Assembly)); 

     Container = new CompositionContainer(catalog); 
     // Apps = Container.GetExportedValues<IApplication>(); - this gets me the IApplication(s), but I dont understand why Apps isn't injected automatically 
     Container.ComposeParts(catalog); 
     IEnumerable<IApplication> app = Container.GetExportedValues<IApplication>(); 
    } 

    public CompositionContainer Container { get; set; } 

    private IEnumerable<IApplication> apps; 

    [ImportMany(typeof(IApplication))] 
    public IEnumerable<IApplication> Apps 
    { 
     get { return apps; } 
     set 
     { 
      apps = value; 
     } 
    } 

實施IApplication

[Export(typeof(IApplication))] 
public class MDFApplication : IApplication {...} 

任何指針中的一個類的簽名被理解的那樣,非常感謝。

回答

2

您從不會調用任何代碼來編寫Bootstrapper類。 ComposeParts將創建該目錄,除非您專門請求它們,否則它不會創建或撰寫任何類。

當您調用GetExportedValues時,容器不會搜索需要導入的所有成員。它要麼返回一個已經存在的實例,要麼創建一個新實例,並滿足其所有的導入屬性。

換句話說,下面的代碼會返回一個完全構造Bootstraper類:

 var b= Container.GetExportedValue<Bootstrapper>(); 
     Debug.Assert(b.Apps!=null);    

爲了組成一個已經存在的對象,你需要調用SatisfyImportsOnce方法。如果可能的話,這將找到所有進口並滿足它們。例如。

 Container.SatisfyImportsOnce(this); 
     Debug.Assert(this.Apps != null);