我会尝试一下这个。当然,在对 MEF 1 进行了一些有限的接触之后,我自己只学习了大约一周的 MEF 2。因此,请考虑以下答案,因为它可能是完全错误的。另外,我发现文档非常差且过时,因此到目前为止,从各个方面来说这都是一场艰苦的战斗。
在我的解决方案中,我利用了ExportDescriptorProvider https://github.com/dotnet/corefx/blob/master/src/System.Composition.Hosting/src/System/Composition/Hosting/Core/ExportDescriptorProvider.cs并将其扩展为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 https://xunit.github.io/与汽车夹具 https://github.com/AutoFixture/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
(在上面的示例中没有看到/测试)这就是我使用程序集进行测试的原因。
希望这足以让您继续前进。或者some无论如何。