silverlight 学习笔记 (八):Prism中MEF的初步认识
学习Prism一定要掌握依赖注入的应用,只有了解了Prism的依赖注入才能更好的使用Prism提升应用开发的架构。
首先说明Prism依赖注入有两种方式及MEF和Unity ,在Prism中是两个没有关联的dll。我倾向于使用MEF,下面学习下MEF在Silverlight中的具体实现。先看MEF实现图示
1、Catalog(目录):为了发现可用于组合容器的部件,组合容器将使用“Catalog”。目录是一个对象,通过它发现可用部件,MEF 提供了用于从提供的类型、程序集或磁盘路径创建Catalog
2、Compose(组合):在MEF中,容器将导入与导出匹配的这一过程我们称之为组合,部件由 MEF 组合,MEF 将部件实例化,然后使导出程序与导入程序相匹配。
3、Part(部件):通过 MEF,应用程序可以通过部件的元数据来发现并检查部件,而不用实例化部件,或者甚至不用加载部件的程序集。在部件中可以指定1个或多个Export和Import。
4、Export(导出):在MEF中通过在类或属性中添加Export属性标签表明该对象能够被其他部件引入。
5、Import(导入):是通过向Container申请导入满足条件的对象实例。
在Import时需要遵循Export契约,否则导入将会失败。
按照MEF的约定,任何一个类或者是接口的实现都可以通过[System.ComponentModel.Composition.Export] 属性将其他定义组合部件(Composable Parts),在任何需要导入组合部件的地方都可以通过在特定的组合部件对象属性上使用 [System.ComponentModel.Composition.Import ]实现部件的组合,两者之间通过契约(Contracts)进行 通信。
在MEF中所有组合都需要匹配契约,契约可以是一个字符串或和类型,每一个Export都需要声明一个契约,同样每一个Import都可以定义相同的契约进行匹配。缺省情况下会按照type进行匹配。如果在Export中指定名称则按名称进行匹配。强烈推荐使用契约名称进行匹配,契约名称可加入命名空间,这样匹配更加准确方便。
下面看实例,来自http://mef.codeplex.com/
1、对象注入
public class SomeComposablePart { ...}
2、属性注入
{
[Export("Timeout")]
public int Timeout
{
get { return int.Parse(ConfigurationManager.AppSettings["Timeout"]); }
}
}
[Export]
public class UsesTimeout
{
[Import("Timeout")]
public int Timeout { get; set; }
}
3、方法注入
{
[Export(typeof(Action<string>))]
public void Send(string message)
{
Console.WriteLine(message);
}
}
[Export]
public class Processor
{
[Import(typeof(Action<string>))]
public Action<string> MessageSender { get; set; }
public void Send()
{
MessageSender("Processed");
}
}
4、契约可采用字符串进行标注
{
[Export("MessageSender")]
public void Send(string message)
{
Console.WriteLine(message);
}
}
[Export]
public class Processor
{
[Import("MessageSender")]
public Action<string> MessageSender { get; set; }
public void Send()
{
MessageSender("Processed");
}
}
5、继承注入,即在基类或借口中定义契约,其子类自动应用其契约
public interface ILogger {
void Log(string message);
}
public class Logger : ILogger {
public void Log(string message);
}
6、构造注入
{
[ImportingConstructor]
public Program(IMessageSender messageSender)
{
...
}
}
7、选项注入
public class OrderController {
private ILogger _logger;
[ImportingConstructor]
public OrderController([Import(AllowDefault=true)] ILogger logger) {
if(logger == null)
logger = new DefaultLogger();
_logger = logger;
}
}
8、集合注入
{
[ImportMany(AllowRecomposition=true)]
public IEnumerable<IMessageSender> Senders {get; set;}
public void Notify(string message)
{
foreach(IMessageSender sender in Senders)
{
sender.Send(message);
}
}
}
9、为了保障一个对象的某些属性能够被及时实例化,可使用IPartImportsSatisfiedNotification
{
[ImportMany]
public IEnumerable<IMessageSender> Senders {get; set;}
public void OnImportsSatisfied()
{
// when this is called, all imports that could be satisfied have been satisfied.
}
}
10、MEF注入共享模式分为NoShared,Shared,Any三种,简单讲就是NoShared意味着每个调用者就将创建一个新的实例,而Shared将会为每一个调用者提供一个唯一的静态实例(也就是说单态)
[PartCreationPolicy(CreationPolicy.Shared)]
public class UserManageViewModel:MyViewModelBase
{
....
}
通过以上介绍基本说明了MEF的注入模式,在实际应用中最重要的也常被忽视的可能就是契约的定义上,如果在类中标示了[Export(typeof(...))]而在引用时使用了[Import["..."]可能会导致无法匹配,另外说明的是所有的部件一定是要被加载到Container中的,否则将会出现无法匹配的异常。
转载于:https://www.cnblogs.com/oldkingsir/archive/2012/02/23/2365624.html
silverlight 学习笔记 (八):Prism中MEF的初步认识相关推荐
- SilverLight学习笔记--Silverlight中WebRequest通讯
本文我们学习如何使用WebRequest类实现客户端和服务器端的通讯. 本例处理过程:在客户端,我们在文本框中输入任意文本,然后用POST方法向服务器端传递信息,服务器端收到从客户端传来的信 ...
- SilverLight学习笔记--如何在xaml文件中操作用户在后台代码定义的类(2)--示例篇:创建一个登录控件(原创)(转载本文请注明出处)...
本文将示例如何运用前篇所写知识来建立一个用户自定义的登录控件.此控件界面非常简单,主要涉及的知识点是: 如何创建用户控件(包括对此控件的自定义事件和属性的编写,此处我们将创建一个名为LoginBo ...
- SilverLight学习笔记--Silverlight中WebService通讯
本文我们学习如何在Silverlight中使用WebService进行通讯. 新建项目Silverlight应用程序,命名为:SLWebService. 在服务器端我们需要做两项目工作: 1.在Web ...
- SilverLight学习笔记--Silverlight中操作DOM元素
在这里我们将实验一下在Silverlight中如何操作HTML的DOM元素. 首先创建Silverlight应用程序. 创建用户界面: <UserControl x:Class=" ...
- vs2010 学习Silverlight学习笔记(7):控件样式与模板
概要: 终于知道Silverlight--App.xaml是干什么用的了,不仅可以用来封装样式(类似css),还可以制定控件模版...好强大的功能啊. 封装: 继续学习<一步一步学Silverl ...
- SilverLight学习笔记--Silverlight之数据绑定初探
数据绑定(Data Binding)是用户界面UI和业务对象或其它数据提供者(data provider)的连接.用户界面对象称为目标,数据提供者成为数据源. 数据绑定帮助隔离应用程序的用户界面层 ...
- SilverLight学习笔记--建立Silverlight自定义控件(5)--绑定动画效果
有了上述的基础,我们进一步完善我们的自定义控件,在此我们将创建Storyboard和前面的添加事件处理方法为我们的自定义控件加上动画效果. 1.首先,在MyDesignButton项目中进一步完善 ...
- SilverLight学习笔记--建立Silverlight自定义控件(1)--外观设计
Silverlight 2 以丰富且强大可靠的控件模型闻名,该模型是平台中包括的控件和第三方控件包的基础.您也可以使用此控件模型构建自己的控件. 在了解如何为新平台编写自定义控件时,我经常先复制一 ...
- SilverLight学习笔记--如何解决Button不响应MouseLeftButtonDown与MouseLeftButtonUp事件的问题...
在Silverlight 2 中的按钮不能响应MouseLeftButtonDown 和 MouseLeftButtonUp 事件,为解决此问题,我们可通过创建自定义按钮控件加以解决, 1.创建自定义 ...
- ReactJS学习笔记八:动画
ReactJS学习笔记八:动画 分类: react学习笔记 javascript2015-07-06 20:27 321人阅读 评论(0) 收藏 举报 react动画 目录(?)[+] 这里只讨论Re ...
最新文章
- 《评人工智能如何走向新阶段》后记(再续26)
- 私有云搭建 OpenStack(centos7.3, centos-release-openstack-ocata)
- 如何正确的检测对象类型?
- Win2008 R2 VDI动手实验系列之八:远程桌面虚拟机终极测试
- php curl post登录与带cookie模拟登录随笔
- Linux下安装whl文件
- [Python]利用python+ffmpeg合并B站视频及格式转换
- 最新使用Python进行开发网站教程项目实战(完整)
- 企业网站建设要注意的四大准则
- svn提示没有设置冲突_SVN冲突解决方法大全
- RL(Chapter 5): Monte Carlo Methods (MC) (蒙特卡洛方法)
- class文件加密和解密
- Syn-QG: Syntactic and Shallow S emantic Rules for Question Generation阅读笔记
- 客制化键盘编程_客制化键盘QMK固件入门-修改keyboard和keymap
- 【Spark GraphX】社交网图分析
- “妖精”团队———阿里巴巴
- 软件测试技术同学如何面对裁员浪潮?
- 深度学习大图切成小块图片代码---针对图像分割而言
- C#开发Android App--01--准备工具
- 核芯国产高压运放CLA4031/ CLA4032