简单的例子
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); } }
这里需要注意的是在进行导入的时候如果辨别到底是使用的哪一个实现呢?在MEF中提供了一个专门用于导入多个实现的特性[System.ComponentModel.Composition.ImportManyAttribute],如上的日志实现示例就可以通过如下的方式实现多部件导入。
public IEnumerable<ILogger> Loggers { get; set; }
ImportManyAttribute特性可以将实现接口的所有实现全部组合起来。下面为使用[ImportMany]的完整示例代码:
namespace MEFTraining.CPC { public partial class MainPage : UserControl { [ImportMany] public IEnumerable<ILogger> Loggers { get; set; } public MainPage() { InitializeComponent(); CompositionInitializer.SatisfyImports(this); if (Loggers != null) { foreach (var logger in Loggers) { logger.WriteLog("Hello World"); } } } } 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); } } }
补充