使用 MEF 1,可以使用 ComposeExportedValue(...)-Method ( container.ComposeExportedValue...
) 将现有对象组合到容器中。Microsoft.Composition (MEF 2) 如何做到这一点?我找不到任何用于此目的的方法。
问问题
1572 次
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.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-03-03T22:56:48.987 回答
1
System.Composition.*_ 是 MEF 的轻量级版本,针对静态合成场景进行了优化并提供更快的合成。
据我所知,System.Composition 不支持动态合成。如果您需要此类功能,则必须使用标准 MEF (System.ComponentModel.Composition.*)。
于 2016-02-23T05:43:54.733 回答