一、简介:MEF框架是用于创建可扩展的轻型应用程序的库;
二、目的:对原生结构进行封装方便使用;
三、实现步骤:
1、定义接口
public interface IMefDemoBase
{
void Init();
}
2、实现接口和特性
/// <summary> ① 必须拥有Export特性 [Export(typeof(IMefDemoBase))] </summary>
[Export(typeof(IMefDemoBase))]
public class MefDemoBase : IMefDemoBase
{
public void Init()
{
throw new NotImplementedException();
}
}
3、 构建组件集合
/// <summary> 提供构建组件集合 </summary>
public class MefEntityProvider<T>
{
// ② 必须拥有Export特性 [Export(typeof(IMefDemoBase))]
[ImportMany]
List<T> doList;
/// <summary> 获取所有接口 </summary>
public List<T> DoList
{
get { return doList; }
set { doList = value; }
}
/// <summary> 通过一组应用程序集创建一个MefEntityProvider </summary>
public static MefEntityProvider<T> CreateInstance(List<Assembly> asses)
{
// ③ 必须拥有Export特性 [Export(typeof(IMefDemoBase))]
MefEntityProvider<T> provider = new MefEntityProvider<T>();
var catalog = new AggregateCatalog();
asses.ForEach(l => catalog.Catalogs.Add(new AssemblyCatalog(l)));
var _container = new CompositionContainer(catalog);
_container.ComposeParts(provider);
return provider;
}
/// <summary> 通过一个应用程序集创建一个MefEntityProvider </summary>
public static MefEntityProvider<T> CreateInstance(Assembly ass)
{
MefEntityProvider<T> provider = new MefEntityProvider<T>();
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(ass));
var _container = new CompositionContainer(catalog);
_container.ComposeParts(provider);
return provider;
}
}
四、实现实例
class Program
{
static void Main(string[] args)
{
List<Assembly> ass = new List<Assembly>();
ass.Add(Assembly.GetEntryAssembly());
MefEntityProvider<IMefDemoBase> provider = MefEntityProvider<IMefDemoBase>.CreateInstance(ass);
provider.DoList.ForEach(l => Console.WriteLine(l.ToString()));
Console.Read();
MefEntityProvider<IDisposable> provider1 = MefEntityProvider<IDisposable>.CreateInstance(ass);
provider1.DoList.ForEach(l => Console.WriteLine(l.ToString()));
Console.Read();
}
}
注:此结构会在加载的程序集中自动找到自定义的接口,实现动态加载
五、设计结构图