Silverlight中使用CompositionInitializer宿主MEF 推荐
2010-07-04 11:07
162 查看
MEF可以在传统应用程序中使用(包括桌面的Winform、控制台程序和Web的ASP.NET),也可以在RIA的Silverlight中使用。在Silverlight中只是宿主的方式有所不同,实际上在Silverlight中也可以像传统应用程序中是方式去宿主,MEF也为Silverlight提供了独特的宿主方式,使用中需要引用System.ComponentModel.Composition.Initialization.dll动态链接库。
Silverlight中提供了一种新的宿主MEF的方式,只需要在Application_Startup事件处理函数中通过调用System.ComponentModel.CompositionInitialization程序集的 System.ComponentModel.Composition.CompositionInitializer类里面的方法一行代码就可以完成MEF的宿主,这是非常方便、简单的。详细如下代码块:
private void Application_Startup(object sender, StartupEventArgs e)
{
CompositionInitializer.SatisfyImports(this);
}
下面用一个简单的示例程序演示下在Silverlight中的MEF的基本应用。比如编写一个日志组件,分别提供两种写日志的方式,既写文本日志和数据库日志,那么对于需要通过MEF托管的部件可以如下代码定义:
public interface ILogger
{
void WriteLog(string message);
}
[Export("TXT",typeof(ILogger))]
public class TXTLogger : ILogger
{
public void WriteLog(string message)
{
System.Console.WriteLine(message);
}
}
[Export("DB",typeof(ILogger))]
public class DBLogger : ILogger
{
public void WriteLog(string message)
{
System.Console.WriteLine(message);
}
}
分别将两个不同的日志记录组件都通过[ExportAttribute]进行标注为导出部件,并分别为其设置好通信契约,那么在导入他们的地方就直接通过契约确定分别导入什么类型的日志记录实现部件。可以通过提供一个统一的门面服务以供系统中统一调用,大致如下代码所示:
/// <summary>
/// 门面服务,聚合不同的日志记录部件,通过MEF进行组合
/// </summary>
[Export]
public class FacadeService
{
[Import("TXT")]
public ILogger TXTLogger { get; set; }
[Import("DB")]
public ILogger DBLogger { get; set; }
}
实际上门面服务作为一个简单、单纯的辅助类,也是可以通过MEF进行动态装配的,如上代码就将FacadeService也进行了[ExportAttribute]标注,表示此门面类也是一个可装配的部件,那么在App 中同样可以通过[ImportAttribute]进行导入的。
/// <summary>
/// 导入FacadeService
/// </summary>
[Import]
public FacadeService Service { get; set; }
接下来看看如何调用,FacadeService是被导入在App中的,在应用的时候可以通过Application.Current获取到当前Silverlight的App对象,总而达到可调用被导入在App中的部件。
public MainPage()
{
InitializeComponent();
var service = (Application.Current as App).Service;
service.TXTLogger.WriteLog("写日志到文本文件");
service.DBLogger.WriteLog("写日志到数据库");
}
注:本文参考于Hosting MEF in Silverlight using CompositionInitializer ,点击连接可访问英文原文。
MEF官方网站:http://mef.codeplex.com/
推荐资源:在应用程序中宿主MEF
![](http://images.cnblogs.com/cnblogs_com/beniao/SLAnimation/DC.gif)
Silverlight中提供了一种新的宿主MEF的方式,只需要在Application_Startup事件处理函数中通过调用System.ComponentModel.CompositionInitialization程序集的 System.ComponentModel.Composition.CompositionInitializer类里面的方法一行代码就可以完成MEF的宿主,这是非常方便、简单的。详细如下代码块:
private void Application_Startup(object sender, StartupEventArgs e)
{
CompositionInitializer.SatisfyImports(this);
}
下面用一个简单的示例程序演示下在Silverlight中的MEF的基本应用。比如编写一个日志组件,分别提供两种写日志的方式,既写文本日志和数据库日志,那么对于需要通过MEF托管的部件可以如下代码定义:
public interface ILogger
{
void WriteLog(string message);
}
[Export("TXT",typeof(ILogger))]
public class TXTLogger : ILogger
{
public void WriteLog(string message)
{
System.Console.WriteLine(message);
}
}
[Export("DB",typeof(ILogger))]
public class DBLogger : ILogger
{
public void WriteLog(string message)
{
System.Console.WriteLine(message);
}
}
分别将两个不同的日志记录组件都通过[ExportAttribute]进行标注为导出部件,并分别为其设置好通信契约,那么在导入他们的地方就直接通过契约确定分别导入什么类型的日志记录实现部件。可以通过提供一个统一的门面服务以供系统中统一调用,大致如下代码所示:
/// <summary>
/// 门面服务,聚合不同的日志记录部件,通过MEF进行组合
/// </summary>
[Export]
public class FacadeService
{
[Import("TXT")]
public ILogger TXTLogger { get; set; }
[Import("DB")]
public ILogger DBLogger { get; set; }
}
实际上门面服务作为一个简单、单纯的辅助类,也是可以通过MEF进行动态装配的,如上代码就将FacadeService也进行了[ExportAttribute]标注,表示此门面类也是一个可装配的部件,那么在App 中同样可以通过[ImportAttribute]进行导入的。
/// <summary>
/// 导入FacadeService
/// </summary>
[Import]
public FacadeService Service { get; set; }
接下来看看如何调用,FacadeService是被导入在App中的,在应用的时候可以通过Application.Current获取到当前Silverlight的App对象,总而达到可调用被导入在App中的部件。
public MainPage()
{
InitializeComponent();
var service = (Application.Current as App).Service;
service.TXTLogger.WriteLog("写日志到文本文件");
service.DBLogger.WriteLog("写日志到数据库");
}
注:本文参考于Hosting MEF in Silverlight using CompositionInitializer ,点击连接可访问英文原文。
MEF官方网站:http://mef.codeplex.com/
推荐资源:在应用程序中宿主MEF
![](http://images.cnblogs.com/cnblogs_com/beniao/SLAnimation/DC.gif)
相关文章推荐
- 在silverlight中使用IsolateStore隔离存储(下) 推荐
- 在Silverlight中使用Json 推荐
- DiscuzNT使用Silverlight进行多文件上传(上) 推荐
- 使用Silverlight Toolkit 绘制图表---区域图和冒泡图 推荐
- 使用createObject(createObjectEx)创建silverlight对象 推荐
- 使用Silverlight Toolkit绘制图表(上)--柱状图 推荐
- 详解Silverlight Treeview的HierarchicalDataTemplate使用 推荐
- 在Silverlight中使用DynamicMethod(动态方法) 推荐
- 【Silverlight】Bing Maps开发应用与技巧六:使用样式美化图钉(Pushpin)控件的ToolTip外观 推荐
- DiscuzNT使用Silverlight进行多文件上传(下) 推荐
- 使用Silverlight Toolkit中的主题(Theme) 推荐
- 在silverlight中使用IsolateStore隔离存储(上) 推荐
- 使用Silverlight Toolkit TreeView(树形控件) 推荐
- Silverlight实用窍门系列:74.Silverlight使用Perst数据库Demo 推荐
- Silverlight之工具箱使用2 推荐
- 【Silverlight】Bing Maps学习系列(四):使用图钉层(Pushpin layer)及地图图层(MapLayer) 推荐
- 使用Silverlight Toolkit的数据分页控件---DataPager 推荐
- 英语阅读推荐:创建Silverlight用户控件 & A*路径搜索中使用二叉堆
- 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps 推荐
- 使用FluorineFx Silverlight库实现Silverlight远程过程调用(RPC) 推荐