2010-12-14 52 views
1

據我所知,爲了使導入/導出屬性相互正確連接,我必須爲每個具有這些屬性的新實例調用compositionContainerInstance.Compose(...)MEF - 我可以創建實例並自動將它們組合到MEF中嗎?

是否有可能自動發生這種情況,所以我不必每當創建一些可組合類的新實例時都這樣做?

這將是一個例子,雖然時間長了,但它抽象了我擁有的問題。

public class Worker1 
{ 
    [Import(typeof(IDataProvider))] 
    public IDataProvider DataProvider; 

    public Worker2 second; 
    //use data provider to perform logic 
} 

public class Worker2 
{ 
    [Import(typeof(IDataProvider))] 
    public IDataProvider DataProvider; 

    //use data provider to perform logic 
} 

[Export(typeof(IDataProvider))] 
public class GeoDataProvider : IDataProvider 
{ 
    //implements logic 
} 

public class Container 
{ 
    private Worker1 t1; 
    public void Init() 
    { 
     AggregateCatalog cat = new AggregateCatalog(); 
     cat.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
     cat.Catalogs.Add(new DirectoryCatalog(".")); 

     CompositionContainer c = new CompositionContainer(cat); 
     c.ComposeParts(new GeoDataProvider(), this); 
    } 

    public void PerformLogic() 
    { 
     t1 = new Worker1; 
     //here it fails because I need c.ComposeParts(t1): 
     t1.DoSomethingWithProvider(); 
     //but even if I do c.ComposeParts(t1), still the t1.second.DataProvider will be null 
     //how to avoid this? 
    } 
} 

什麼我希望的是一種自由創作Worker1/Worker2的新實例,而無需知道他們在使用前必須組成。這是可行的嗎?

回答

4

有人必須知道他們需要組成。

如果您要自由創建Worker1和Work2實例而不是讓MEF創建它們,那麼您還必須爲MEF提供滿足導入新實例的機會,或者如您發現的那樣,IDataProvider字段永遠不會填寫。

下面是一個例子,您只需讓MEF根據需要創建類。只需要一個'ComposeParts'調用即可完成所有設置。

[Export] 
public class Worker1 
{ 
    [Import] 
    public IDataProvider DataProvider; 

    [Import] 
    public Worker2 second; 

    //use data provider to perform logic 
    public void DoSomethingWithProvider() { 
    } 
} 

[Export] 
public class Worker2 
{ 
    [Import] 
    public IDataProvider DataProvider; 

    //use data provider to perform logic 
} 

[Export(typeof(IDataProvider))] 
public class GeoDataProvider : IDataProvider 
{ 
    //implements logic 
} 

public class Container 
{ 
    [Import] 
    private Worker1 t1; 

    public void Init() 
    { 
    AggregateCatalog cat = new AggregateCatalog(); 
    cat.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
    cat.Catalogs.Add(new DirectoryCatalog(".")); 

    CompositionContainer c = new CompositionContainer(cat); 
    c.ComposeParts(this); 
    } 

    public void PerformLogic() 
    { 
    t1.DoSomethingWithProvider(); 
    } 
} 
+0

謝謝,這真是一個很好的答案。不幸的是,我的一些工作人員實際上是UserControls(由設計師實例化),所以我必須在每個嵌套控件內添加一些邏輯來編寫這些實例。再次感謝!我現在真的瞭解了這個MEF :) – veljkoz 2010-12-14 16:44:51