Last active
March 14, 2024 10:09
-
-
Save davidwengier/87417440b6c51d71a88455ac83ba3f36 to your computer and use it in GitHub Desktop.
MEF GetExportedValue validation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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