使用MEF 1,可以使用ComposeExportedValue(...) - Method(container.ComposeExportedValue...
)将现有对象组合到容器中。如何使用Microsoft.Composition(MEF 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.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
的程序集(在上面的示例中未见/测试),这就是我使用程序集进行测试的原因。
希望这足以让你继续前进。或者一些方式,无论如何。
答案 1 :(得分:1)
System.Composition。* _是MEF的轻量级版本,已针对静态合成场景进行了优化,并提供了更快的合成。
据我所知,System.Composition并不支持动态组合。如果您需要这些功能,则必须使用标准MEF(System.ComponentModel.Composition。*)。