MEF的核心包括一个catalog和CompositionContainer。category用于发现扩展,而container用于协调创建和梳理依赖性。每个组合的Part提供了一个或多个Export,并且通常依赖于一个或多个外部提供的服务或Import。每个Part管理一个实例为应用程序运行。
MEF提供三种方式发现部件:
① AssemblyCatalog 在当前程序集发现部件。
② DirectoryCatalog 在指定的目录发现部件。
③ DeploymentCatalog 在指定的XAP文件中发现部件。
因为历史原因,MEF有两个版本。一个是Framwork的System.ComponentModel.Composition。
一个是Nuget包的(这个支持.Net Core) System.Composition
下面来演示一个.Net Core使用MEF容器
using System; using System.Collections.Generic; using System.Composition; using System.Composition.Convention; using System.Composition.Hosting; using OldModel; using NewModel; namespace NewMEF { class Program { static void Main(string[] args) { var conventions = new ConventionBuilder(); conventions.ForTypesDerivedFrom<IDog>().Export<IDog>().Shared(); var assemblies = new[] { typeof(IDog).Assembly }; var configuration = new ContainerConfiguration().WithAssemblies(assemblies, conventions); using (var container = configuration.CreateContainer()) { var plugins = container.GetExports<IDog>(); foreach (var item in plugins) { Console.WriteLine("Name:{0}",item.Name); } } Console.ReadKey(); } } }
using System; using System.Collections.Generic; using System.Text; using System.Composition; namespace OldModel { public interface IDog { string Name { get; } } [Export(typeof(IDog))] public class FatDog : IDog { public string Name => "肥狗!"; } [Export(typeof(IDog))] public class StupidDog:IDog { string IDog.Name { get => "蠢狗"; } } }