Skip to content

Instantly share code, notes, and snippets.

@davidwengier
Last active March 14, 2024 10:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save davidwengier/87417440b6c51d71a88455ac83ba3f36 to your computer and use it in GitHub Desktop.
Save davidwengier/87417440b6c51d71a88455ac83ba3f36 to your computer and use it in GitHub Desktop.
MEF GetExportedValue validation
using System.Composition;
using Microsoft.VisualStudio.Composition;
var exportProvider = await GetExportProviderAsync();
var service = exportProvider.GetExportedValue<IService>();
var dependent = exportProvider.GetExportedValue<IDependent>();
var service2 = exportProvider.GetExportedValue<IService>();
var dependent2 = exportProvider.GetExportedValue<IDependent>();
var service3 = exportProvider.GetExportedValue<Service>();
Console.WriteLine(object.ReferenceEquals(service, dependent.Service)); // true
Console.WriteLine(object.ReferenceEquals(service, dependent2.Service)); // true
Console.WriteLine(object.ReferenceEquals(service2, dependent.Service)); // true
Console.WriteLine(object.ReferenceEquals(service, service2)); // true
Console.WriteLine(object.ReferenceEquals(service, service3)); // true
async Task<ExportProvider> GetExportProviderAsync()
{
var resolver = Resolver.DefaultInstance;
var discovery = new AttributedPartDiscovery(resolver, isNonPublicSupported: true); // MEFv2 only
var parts = await discovery.CreatePartsAsync([typeof(Program).Assembly]).ConfigureAwait(false);
var catalog = ComposableCatalog.Create(resolver).AddParts(parts);
var configuration = CompositionConfiguration.Create(catalog).ThrowOnErrors();
var runtimeComposition = RuntimeComposition.CreateRuntimeComposition(configuration);
var exportProviderFactory = runtimeComposition.CreateExportProviderFactory();
return exportProviderFactory.CreateExportProvider();
}
public interface IService
{
}
public interface IDependent
{
IService Service { get; }
}
[Export(typeof(IService)), Shared]
[Export(typeof(Service))]
public class Service : IService
{
}
[Export(typeof(IDependent)), Shared]
[method: ImportingConstructor]
public class Dependent(IService service) : IDependent
{
public IService Service { get; } = service;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment