迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)
MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高 灵活、高扩展性的效果。在具体的设计开发中,存在着某些对象是不需要在系统运行或者的附属对象初始化的时候进行实例化的,仅仅只 需要在需要使用到他的时候才会进行实例化,从系统的上来说这也是提高系统性能的一种可行的实现方式,这种方式就可以理解为对象的 迟延初始化,或者叫迟延加载。MEF也对此使用场景提供了完善的实现机制,下面来看看在MEF中的迟延初始化是如何使用的。
namespace MEFTraining.LzayImports
{
public interface ILogger
{
void WriteLog(string message);
}
[Export(typeof(ILogger))]
public class DBLogger : ILogger
{
public void WriteLog(string message)
{
MessageBox.Show(message);
}
}
}
通过使用前几篇博文中使用的日志组件为例,在日志记录的具体实现对象上进行对象的导出[Export]配置。如果是使用传统的方式进行 部件的导入则如下代码块所示:
[Import(typeof(ILogger))]
public ILogger Logger { get; set; }
如果需要进行迟延(Lazy)加载,MEF专门提供了用于迟延加载的方式,既使用Lazy类来完成迟延加载,然后通过其他属性Value获取到 所加载到的对象。详细的使用如下代码块:
public partial class MainPage : UserControl
{
//传统加载
[Import(typeof(ILogger))]
public ILogger Logger { get; set; }
//迟延加载
[Import]
public Lazy<ILogger> Service;
public MainPage()
{
InitializeComponent();
CompositionInitializer.SatisfyImports(this);
Logger.WriteLog("日志内容");
Service.Value.WriteLog("日志内容");
}
}
通过调试输出可以得到使用迟延导入的对象的详细信息,下面是通过在命令窗口中输出的Service和Service.Value的详细信息。
Service
ThreadSafetyMode=PublicationOnly, IsValueCreated=true, IsValueFaulted=false, Value= {MEFTraining.LzayImports.DBLogger}
IsValueCreated: true
Service.Value
{MEFTraining.LzayImports.DBLogger}
[MEFTraining.LzayImports.DBLogger]: {MEFTraining.LzayImports.DBLogger}