2010-08-16 21 views
3

我有一個MEF的CompositionContainer,一個合同(如IFoo)和一個模塊(Prism模塊,但這裏沒什麼關係,只是一些組件)。 我想在我的模塊中註冊合同的實現(FooImpl)。MEF:如何手動配置導出合同執行

如果它的團結我願意做這樣的:

unity.RegisterType<IFoo, FooImpl>(). 

這就是全部。 隨着MEF我感到困惑。我必須用ExportAttribute標記我的實現,但這會導致它自動導出。我想自己管理這個。 看看代碼:

class MyModule: IModule { 
    private CompositionContainer m_container; 
    public MyModule(CompositionContainer container) { 
    m_container = container; 
    } 
    public void Initialize() { 
    ??? I want something like m_container.CreateExport<IFoo, FooImpl>() 
    } 
} 

public interface IFoo {} 
public class FooImpl : IFoo { 
    //[ImportingConstructor] 
    public FooImpl(ISomeService svc) {} 
} 

在初始化我想manualy 出口 FooImpl爲IFoo的合同不是依靠ExportAttribute上FooImpl類。 我知道我只是可以創建一個實例FooImpl(在上面的MyModule.Initialize中),但是 FooImpl對其他組件/服務具有構造函數依賴關係,我希望在創建時解析它們。

所以可能我應該問:如何手動添加具有CompositionContainer實例和合同的導出?然後將它標記爲ImportingConstructorAttribute?

回答

0

這不是默認情況下MEF的工作方式。但是,您可以創建自己的ExportProvider實現,並將其傳遞給CompositionContainer構造函數。項目有export provider implementations幾個例子。 Fluent Definition Provider可能與您描述的最接近。還有一個出口提供商,提供與統一的整合。

+0

謝謝,我會看看。但我想用已有的CompositionContainer來做到這一點。 – Shrike 2010-08-17 17:10:25

6

看看AttributedModelServices.ComposeExportedValue。您可以這樣使用它:

m_container.ComposeExportedValue<IFoo>(new IFooImpl()); 
+0

在這裏,我失去了構造函數依賴關係替換。 – Shrike 2010-08-17 17:08:19

+0

@Shrike:這是正確的。我相信當使用ComposeExportedValue()時,這會導致重組開始。在MEF規則下,當發生「重組」時,會有一個負面影響:不使用ImportingConstructors。格倫布洛克在他的博客中解釋了爲什麼。 – eduncan911 2011-03-05 00:47:28