2016-02-10 80 views
2

使用MEF 1,可以使用ComposeExportedValue(...) - 方法(container.ComposeExportedValue...)將現有對象組合到容器中。 Microsoft.Composition(MEF 2)如何做到這一點?爲此我找不到任何方法。使用MEF 2編寫導出值

回答

1

https://mef.codeplex.com/指出

System.Composition。* _是MEF,其已經用於靜態組合物場景優化和提供更快的組合物的輕量級版本。

而據我所知,從我的經驗System.Composition不支持動態組合。如果你需要這樣的功能,你必須使用標準的MEF(System.ComponentModel.Composition。*)。

2

我會在這一個鏡頭。誠然,在對MEF 1進行一些有限的曝光之後,我只有大約一週時間學習MEF 2。所以,請考慮以下答案,因爲這可能是完全錯誤的。另外,我發現文檔非常差,並且過時,所以迄今爲止在各方面都是一場艱苦的戰鬥。

在我的解決方案中,我使用了ExportDescriptorProvider並將其擴展爲InstanceExportDescriptorProvider,如以下代碼所示。

(!請注意,這應被視爲證據的概念,而不是最終的代碼)

public class InstanceExportDescriptorProvider : ExportDescriptorProvider 
{ 
    readonly object instance; 

    public InstanceExportDescriptorProvider(object instance) 
    { 
     this.instance = instance; 
    } 

    public override IEnumerable<ExportDescriptorPromise> GetExportDescriptors(CompositionContract contract, DependencyAccessor descriptorAccessor) 
    { 
     if (contract.ContractType.IsInstanceOfType(instance)) 
     { 
      yield return new ExportDescriptorPromise(contract, contract.ContractType.FullName, true, NoDependencies, dependencies => ExportDescriptor.Create((context, operation) => instance, NoMetadata)); 
     } 
    } 
} 

(使用xUnit 2.0AutoFixture配對),以顯示如何做到這一點可以使用如下支持試驗:

[Theory, AutoData] 
public void VerifyInstanceExport(Assembly[] assemblies) 
{ 
    using (var container = new ContainerConfiguration() 
     .WithProvider(new InstanceExportDescriptorProvider(assemblies)) 
     .CreateContainer()) 
    { 
     var composed = container.GetExport<Assembly[]>(); 
     Assert.Equal(assemblies, composed); 
    } 
} 

在我來說,我想有機會獲得傳入ContainerConfiguration(不可見/在上面的例子測試)的組件所以這就是爲什麼我與組件測試。

希望這將足以讓你在你的路上。或者無論如何,一些的方式。

+0

哇,這很醜陋。我懷疑你是正確的,WithProvider是唯一的方法來做到這一點。幸運的是,它似乎是一個可以讓你填充api中任何漏洞的全部功能。有一個github問題用於組合來自現有實例的導出值:https://github.com/dotnet/corefx/issues/11856 –