.NET Core 中的 MEF

momo314相同方式共享非商业用途署名转载

可托管扩展框架(Managed Extensibility Framework,MEF)印象中应该是在.NET Framework 4.0引进的,自从有了 MEF 之后,他一直是我最喜欢的功能之一。相比于Ioc,MEF更加注重可动态扩展的,插拔式的插件开发。

但是,由于 .NET Framework 内置的 MEF 版本与 .NET Core 中使用的通过 Nuget 发布的版本不同 (后者更加轻量高效,MEF2),导致 .NET Framework 中用惯了的 MEF 在向 .NET Core 迁移时不太习惯。

下面给出 .NET Core 版本的 MEF 代码示例:

/// <summary>
/// 组件加载器
/// </summary>
public class ComposedContainer
{
    /// <summary>
    /// 从bin目录加载指定类型的实例
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static IEnumerable<T> LoadExports<T>()
    {
        var assembly = Assembly.GetEntryAssembly();

        var path = assembly.Location.TrimEnd(assembly.ManifestModule.Name.ToArray());
        var assemblies = Directory
                .GetFiles(path, "*.dll", SearchOption.TopDirectoryOnly)
                .Where(item =>
                    !item.StartsWith(Path.Combine(path, "Microsoft."))
                    && !item.StartsWith(Path.Combine(path, "System.")))
                .Select(AssemblyLoadContext.Default.LoadFromAssemblyPath)
                .ToList();
        var conventions = new ConventionBuilder();
        conventions.ForTypesDerivedFrom<T>().Export<T>().Shared();
        var configuration = new ContainerConfiguration().WithAssemblies(assemblies, conventions);
        using (var container = configuration.CreateContainer())
        {
            return container.GetExports<T>();
        }
    }
}

以上代码在 .netcoreapp 2.0 中双系统(windows/linux)环境下均测试通过 。

✎﹏ 本文来自于 momo314的神奇海螺 ,文章原创,转载请注明作者并保留原文链接。