Dependency injection 用MEF 2合成导出值

Dependency injection 用MEF 2合成导出值,dependency-injection,mef,mef2,Dependency Injection,Mef,Mef2,使用MEF 1,可以使用ComposeExportedValue(…)-方法(container.ComposeExportedValue…)将现有对象组合到容器中。如何使用Microsoft.Composition(MEF 2)实现这一点?我找不到任何用于此目的的方法。声明 System.Composition.*是MEF的轻量级版本,已针对静态合成场景进行了优化,并提供了更快的合成 据我的经验系统所知,构图不支持动态构图。如果您需要这些功能,您必须使用标准的MEF(System.Compon

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

声明

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


据我的经验系统所知,构图不支持动态构图。如果您需要这些功能,您必须使用标准的MEF(System.ComponentModel.Composition.*)。

我将尝试一下这个功能。诚然,在有限接触MEF 1之后,我自己只花了大约一周的时间学习MEF 2。因此,请考虑以下答案,因为它可能是完全错误的。此外,我发现文档非常差,而且已经过时,因此到目前为止,在各个方面都是一场艰苦的战斗

在我的解决方案中,我使用并将其扩展为
InstanceExportDescriptorProvider
,如下代码所示

(请注意,这应被视为概念证明,而不是最终代码!)

公共类实例ExportDescriptorProvider:ExportDescriptorProvider
{
只读对象实例;
公共实例ExportDescriptorProvider(对象实例)
{
this.instance=instance;
}
public override IEnumerable GetExportDescriptor(CompositionContract、DependencyAccessor descriptorAccessor)
{
if(contract.ContractType.IsInstanceOfType(实例))
{
返回新的ExportDescriptorPromise(contract,contract.ContractType.FullName,true,NodeDependencies,dependencies=>ExportDescriptor.Create((上下文,操作)=>instance,NoMetadata));
}
}
}
支持性测试(使用配对测试)显示如何使用该测试,如下所示:

[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 );
    }
}
[理论,自动数据]
public void VerifyInstanceExport(程序集[]程序集)
{
使用(var container=newcontainerConfiguration()
.WithProvider(新的InstanceExportDescriptorProvider(程序集))
.CreateContainer())
{
var composite=container.GetExport();
Assert.Equal(程序集,组合);
}
}
在本例中,我希望能够访问传递到
容器配置
(在上面的示例中未看到/测试)中的程序集,这就是我使用程序集进行测试的原因


希望这足以让你走上正轨。或者,无论如何,以某种方式。

哇,这太难看了。我怀疑你是正确的,因为WithProvider是唯一的方法。幸运的是,它似乎是一个包罗万象的工具,可以让您填补api中的任何漏洞。从现有实例合成导出值时存在github问题:
[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 );
    }
}