0
点赞
收藏
分享

微信扫一扫

MEF 插件化 Demo


一、基本概念

  • MEF:Managed Extensibility Framework,.NET 4.0中带来的一个基于托管的扩展程序开发框架。
  • Contract:契约,即一种约定,具体在代码中表现为接口和抽象类。
  • Import:导入,导入契约的实现,说明此处需要一个实现的契约。
  • Export:导出,导出契约的实现,说明相应的类中实现了相应的契约。
  • Part:部件,即实现契约的类。
  • Catalog:目录(我是这样定义的),存放部件的地方,当需要某个部件时,会在目录中寻找。
  • Container:容器,存放目录并进行部件管理,如导出、导入等。
  • Compose:组装,通过容器在目录中寻找到实现了相应契约的部件,进行部件的组装。 

二、Demo

整体样子如下

MEF 插件化 Demo_List

下面是各个部分的代码示例

MEFDemo

class Program
{
static void Main(string[] args)
{
PlugerBase<IBookService> plugerBase = new PlugerBase<IBookService>();
var list = new List<string>() { "音乐", "数学", };
foreach (var item in list)
{
var d = plugerBase.GetClass(item);//通过名称获取
Console.WriteLine(d.GetBookName());
}
Console.WriteLine();
foreach (var item in plugerBase.DoPluginList)
{
Console.WriteLine($"Name:{item.Metadata.Name} Value:{item.Value.GetBookName()}");
}
Console.WriteLine("插件化");
Console.ReadLine();
}
}

public class PlugerBase<T>
{
public T GetClass(string className)
{
foreach (var item in DoPluginList)
{
if (item.Metadata.Name == className)
{
return (T)item.Value;
}
}
return default(T);
}
/// <summary>
/// 插件列表
/// </summary>
[ImportMany(typeof(IBookService))]
private List<Lazy<IBookService,IBookMetadata>> DoPluginList = new List<Lazy<IBookService, IBookMetadata>>();
public PlugerBase(string subFolderName = "Plug")
{
var catelog = new AggregateCatalog();
AssemblyCatalog assemblyCataLog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
catelog.Catalogs.Add(new DirectoryCatalog(subFolderName));
catelog.Catalogs.Add(assemblyCataLog);

var container = new CompositionContainer(catelog);
container.ComposeParts(this);
}
}

InterfaceServer

/// <summary>
/// 数类型的标记
/// </summary>
public interface IBookMetadata
{
/// <summary>
/// 获取标记
/// </summary>
[DefaultValue(0)]
int Mark { get; }
/// <summary>
/// 获取名字
/// </summary>
string Name { get; }
}

/// <summary>
/// 公共接口
/// </summary>
public interface IBookService
{
/// <summary>
/// 书名
/// </summary>
string BookName { get; set; }
/// <summary>
/// 获取书名
/// </summary>
/// <returns></returns>
string GetBookName();
}

MusicBookAdd

[Export(typeof(IBookService)), ExportMetadata("Mark", 1), ExportMetadata("Name", "音乐")]
public class MusicBook : IBookService
{
public string BookName { get; set; } = "MusicBook";

public string GetBookName()
{
return BookName + DateTime.Now.ToString();
}
}

NumberBookAdd

[Export(typeof(IBookService)), ExportMetadata("Mark", 2), ExportMetadata("Name", "数学")]
public class NumberBook : IBookService
{
public string BookName { get; set; } = "NumberBook";

public string GetBookName()
{
return BookName+DateTime.Now.ToString();
}
}

 

结果如下:

MEF 插件化 Demo_c#_02

举报

相关推荐

0 条评论