在应用程序中宿主MEF其实非常简单,只需要创建一个组合容器对象(CompositionContainer)的实例,然后将需要组合的部件 (Parts)和当前宿主程序添加到容器中即可。首先需要添加MEF框架的引用,既 System.ComponentModel.Composition.dll,
可能会定义一个或多个导入(Import)和导出(Export)部件,然后通过MEF容器进行组合,其实也可以理解为“依赖注入”的一种实现。比如定义一个图书接口和一个接口的实现类,在此基础上使用MEF的导入导出特性:
public interface IService
{
void GetName();
}
/// <summary>
/// 导入
/// </summary>
[Export(typeof(IService))]
public class ComputerService : IService
{
public void GetName()
{
Console.WriteLine("Hello MEF");
}
}
使用MEF的[System.ComponentModel.Composition.Export]对接口的实现进行导出设置,让接口的实现以容器部件 的方式存在,然后通过组合容器进行装配加载,这个过程中就包括了接口的实例化的过程。接下来就需要在MEF的宿主程序中定义一个接口的属性,并为其标注 [System.ComponentModel.Composition.Import]特性以实现接口实现类的导入
完整代码示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
namespace Test
{
public interface IService
{
void GetName();
}
/// <summary>
/// 导入 以接口设置为统一的导入接口可以变化框架为工厂
/// </summary>
[Export(typeof(IService))]
public class ComputerService : IService
{
public void GetName()
{
Console.WriteLine("Hello MEF");
}
}
class Program
{
/// <summary>
/// 导入接口的实现部件(Part)
/// </summary>
[Import]
public IService Service { get; set; }
/// <summary>
/// 宿主MEF并组合部件
/// </summary>
private void Compose()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
//将部件(part)和宿主程序添加到组合容器
container.ComposeParts(this,new ComputerService());
Service.GetName();
}
static void Main(string[] args)
{
Program p = new Program();
p.Compose();
}
}
}

浙公网安备 33010602011771号