MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用
按照MEF的约定,任何一个类或者是接口的实现都可以通过 [System.ComponentModel.Composition.Export] 属性将其他定义组合部件 (Composable Parts),在任何需要导入组合部件的地方都可以通过在特定的组合部件对象属性上使用 [System.ComponentModel.Composition.Import ]实现部件的组合,两者之间通过契约(Contracts)进行通信,实际上这一步可以简单的理 解为“依赖注入”,本质上就是对象的实例初始化过程。
我个人理解,凡是通过MEF的[ExportAttribute]标注的对象都可以理解为一个可进行组合的部件,包括对象和对象的属性、字段、方法 、事件等;且该对象可以通过[ImportAttribute]进行导入。如下示例代码:
public class StringProvider
{
/// <summary>
/// 定义导出部件--契约为“Message”
/// </summary>
[Export("Message")]
public string Output
{
get { return "Hello World"; }
}
}
public class Client
{
/// <summary>
/// 导入指定契约的部件
/// </summary>
[Import("Message")]
public string Input { get; set; }
public void Print()
{
Console.WriteLine(Input);
}
}
所谓的契约也就是一种约定,或者叫做一种规则。如上代码中就使用到了契约,在对象StringProvider中就定义了一个导出部件属性( Output),并为其指定了通信契约为“Message”。这里的“Message”就是一种约定,既约定为在需要使用到这个属性的地方,都可以通 过 [ImportAttribute]使用契约(Message)进行部件的导入。
接下来结合《Silverlight中使用 CompositionInitializer宿主MEF》一文中使用的日志记录的应用实例为基础来看看关于契约 (Contracts)在较为复杂的部件中的的具体使用方法。假设定义了如下的接口与部件实现代码:
public interface ILogger
{
void WriteLog(string message);
}
[Export(typeof(ILogger))]
public class TXTLogger : ILogger
{
public void WriteLog(string message)
{
MessageBox.Show("TXTLogger>>>>>" + message);
}
}
[Export(typeof(ILogger))]
public class DBLogger : ILogger
{
public void WriteLog(string message)
{
MessageBox.Show("DBLogger>>>>>" + message);
}
}