Silverlight中使用CompositionInitializer宿主MEF

简介:
 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(
" 写日志到数据库 " );
}




本文转自 beniao 51CTO博客,原文链接:http://blog.51cto.com/beniao/343615,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
8月前
|
C#
C#开源的虚拟桌宠模拟器,可以内置到任何WPF应用程序 - VPet
C#开源的虚拟桌宠模拟器,可以内置到任何WPF应用程序 - VPet
|
12月前
|
C# C++ Windows
3.只使用代码创建WPF应用程序
3.只使用代码创建WPF应用程序
81 0
|
C# 图形学 容器
WPF PRISM开发入门二(Unity依赖注入容器使用)
原文:WPF PRISM开发入门二(Unity依赖注入容器使用) 这篇博客将通过一个控制台程序简单了解下PRISM下Unity依赖注入容器的使用。我已经创建了一个例子,通过一个控制台程序进行加减乘除运算,项目当中将输入输出等都用接口封装后,结构如下: 当前代码可以点击这里下载。
1872 0
|
C# 容器 开发框架
MEF 插件式开发 - WPF 初体验
原文:MEF 插件式开发 - WPF 初体验 目录 MEF 在 WPF 中的简单应用 加载插件 获取元数据 依赖注入 总结 MEF 在 WPF 中的简单应用 MEF 的开发模式主要适用于插件化的业务场景中,C/S 和 B/S 中都有相应的使用场景,其中包括但不限于 ASP.NET MVC 、ASP WebForms、WPF、UWP 等开发框架。
1086 0
|
Web App开发 JSON 测试技术