2

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

4

2 回答 2

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(在上面的示例中未看到/测试)的程序集,这就是我使用程序集进行测试的原因。

希望这足以让您继续前进。或者以某种方式,无论如何。

于 2016-03-03T22:56:48.987 回答
1

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

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

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

于 2016-02-23T05:43:54.733 回答