使用MEF 2撰写导出值

时间:2016-02-10 16:55:10

标签: dependency-injection mef mef2

使用MEF 1,可以使用ComposeExportedValue(...) - Method(container.ComposeExportedValue...)将现有对象组合到容器中。如何使用Microsoft.Composition(MEF 2)完成此操作?我找不到任何方法用于此目的。

2 个答案:

答案 0 :(得分:3)

我会在这一次拍摄。当然,在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的程序集(在上面的示例中未见/测试),这就是我使用程序集进行测试的原因。

希望这足以让你继续前进。或者一些方式,无论如何。

答案 1 :(得分:1)

https://mef.codeplex.com/表示

  

System.Composition。* _是MEF的轻量级版本,已针对静态合成场景进行了优化,并提供了更快的合成。

据我所知,System.Composition并不支持动态组合。如果您需要这些功能,则必须使用标准MEF(System.ComponentModel.Composition。*)。