使用MEF 1,可以使用ComposeExportedValue(.)-Method (container.ComposeExportedValue...)将现有对象组合到容器中。如何使用Microsoft.Composition (Mef2)来完成这一任务?我找不到任何方法来达到这个目的。
发布于 2016-03-03 22:56:48
我会试试这个的。当然,我在学习MEF 2之前只有一周的时间,因为我对MEF 1的接触是有限的。所以,请考虑以下的答案,因为这可能是完全错误的。此外,我发现文档非常糟糕,过时了,因此到目前为止,这是一场艰苦的战斗。
在我的解决方案中,我使用了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.0与AutoFixture配对)显示将如何使用该测试如下:
[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中的程序集(在上面的示例中没有看到/测试),所以这就是为什么我要用程序集进行测试。
希望这足以让你上路。或者的方式,在任何情况下。
发布于 2016-02-23 05:43:54
System.Composition.*_是MEF的轻量级版本,它针对静态组合场景进行了优化,并提供了更快的组合。
据我所知,根据我的经验,System.Composition不支持动态组合。如果需要这样的功能,就必须使用标准的MEF (System.ComponentModel.Composation.*)。
https://stackoverflow.com/questions/35321270
复制相似问题