Using MEF to Set Up Dependency Injection
The Managed Extensibility Framework (MEF) is a built-in set of elements that allows you to “export” and “import” objects across projects that allows you to not rely on hard dependencies. From Microsoft: The Managed Extensibility Framework or MEF is a library for creating lightweight, extensible applications. It allows application developers to discover and use extensions with no configuration required. It also lets extension developers easily encapsulate code and avoid fragile hard dependencies. MEF not only allows extensions to be reused within applications, but across applications as well. To use MEF you need to include the following reference in your project: System.ComponentModel.Composition We need to define a container. This is where all the exported values will be stored. One simple way to do that is to create a class such as this one: public static class Mef
{
private static CompositionContainer container; public static CompositionContainer Container
{
get
{
if (container == null)
{
var catalog =
new DirectoryCatalog(".", "MyProjectNamespace.*"); container = new CompositionContainer(catalog);
} return container;
}
}
}
This will grab all the exported values from all the assemblies in the same directory starting with “MyProjectNamespace”. And then I can annotate the classes I want to export as in the following:
[Export]
public class Logger
{
} [Export]
public class GameService
{
[Import]
private Logger log;
}
Whenever I need a GameService I can request it from the container as in the following:
GameService gameService = Mef.Container.GetExportedValue<GameService>();
Notice that on GameService class I have a field with an [Import] attribute. This means MEF will resolve the value for me while it is retrieving the exported value for GameService. I can also export a class identified by an interface:
[Export(typeof(IGameService))]
public class GameService
{
[Import]
private Logger log;
}
And I could use it as:
GameService gameService = Mef.Container.GetExportedValue<IGameService>();
MEF will get whatever it has in its container for IGameService. If you have more than one export for IGameService and you attempt to resolve it with GetExportedValue you will get an exception. You can have multiple exports, but the way you need to handle it is different. For example, I can have a screen with several tabs that are exported as in the following:
public interface ITab { } [Export(typeof(ITab))]
public class HomeTab : ITab { } [Export(typeof(ITab))]
public class GamesTab : ITab { } [Export(typeof(ITab))]
public class WishlistTab : ITab { }
And I can import them using the ImportMany attribute as in the following:
[Export]
public class Home
{
[ImportMany]
private List<ITab> tabs;
}
ImportMany And there is also the ImportingConstructor attribute that allows me to import objects while I am creating the instance.
[Export]
public class GameService
{
private Logger log; [ImportingConstructor]
public GameService(Logger log)
{
this.log = log;
}
} [Export]
public class Logger { }
ImportingConstructor
Using MEF to Set Up Dependency Injection的更多相关文章
- MVC Controller Dependency Injection for Beginners【翻译】
在codeproject看到一篇文章,群里的一个朋友要帮忙我翻译一下顺便贴出来,这篇文章适合新手,也算是对MEF的一个简单用法的介绍. Introduction In a simple stateme ...
- Ninject学习(一) - Dependency Injection By Hand
大体上是把官网上的翻译下而已. http://www.ninject.90iogjkdcrorg/wiki.html Dependency Injection By Hand So what's Ni ...
- 控制反转Inversion of Control (IoC) 与 依赖注入Dependency Injection (DI)
控制反转和依赖注入 控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性.控制反转Inversion of Control (IoC) 意味着一个对象不会新创建一个对象并依赖着它来完成工 ...
- [转载][翻译] IoC 容器和 Dependency Injection 模式
原文地址:Inversion of Control Containers and the Dependency Injection pattern 中文翻译版本是网上的PDF文档,发布在这里仅为方便查 ...
- Dependency Injection
Inversion of Control - Dependency Injection - Dependency Lookup loose coupling/maintainability/ late ...
- Inversion of Control Containers and the Dependency Injection pattern(转)
In the Java community there's been a rush of lightweight containers that help to assemble components ...
- Scala 深入浅出实战经典 第57讲:Scala中Dependency Injection实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- 【译】Dependency Injection with Autofac
先说下为什么翻译这篇文章,既定的方向是架构,然后为了学习架构就去学习一些架构模式.设计思想. 突然有一天发现依赖注入这种技能.为了使得架构可测试.易维护.可扩展,需要架构设计为松耦合类型,简单的说也就 ...
- 依赖注入 | Dependency Injection
原文链接: Angular Dependency Injection翻译人员: 铁锚翻译时间: 2014年02月10日说明: 译者认为,本文中所有名词性的"依赖" 都可以理解为 & ...
随机推荐
- Mysql--select基础查询
基本语法:select 查询列表 from 表名 查询列表可以是表中字段.常量值.表达式.函数:查询的结果是一个虚拟的表格. 注意: ①sql语言大小写不敏感 ②关键字不能分行或略写 ③一般书写方式为 ...
- 二十八、MySQL 元数据
MySQL 元数据 你可能想知道MySQL以下三种信息: 查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数. 数据库和数据表的信息: 包含了数据库及数据表的结构信息. M ...
- Python_常用模块
一.内置模块 定义:其实模块简单说就是一堆代码实现某个功能,它们是已经写好的.py文件.只需要用import应用即可. 分类: 1. 自定义模块,就是自己写的.py文件为了实现某个功能. 2. 内置标 ...
- Yii 2.x html 代码压缩
<?php namespace Pangu\web; use yii\base\Component; /** * html格式响应内容格式化 * @author zhouzhian * */ c ...
- python3 练习题100例 (七)
题目七:将一个列表的数据复制到另一个列表中. #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 题目七:将一个列表的数 ...
- Head First Python (一)
建立一个数组: cast = ["Cleese","Palin","Jones","Idle"] 列出数组有多少数据项: ...
- django之配置静态文件
# 别名 STATIC_URL = '/static/' # 配置静态文件,名字必须是STATICFILES_DIRS STATICFILES_DIRS = [ os.path.join(BASE_D ...
- HDU 2087 HDU 1867 KMP标准模板题
贴两道题,其中HDU2087是中文题,故不解释题目, 思路是,一发KMP,但是特别处理最后一位的失配边为0,这样就可以保证“判断完成但是不多判断”. 第二题,很毒瘤的题,要求求出,给定字符串A,B能够 ...
- 51nod 1105 二分答案法标准题目
二分答案法例题,用于练习二分答案的基本思想非常合适,包括了思维方式转换的内容(以前我们所做的一直是利用二分法求得数组元素对应指针之类,但是现在是直接对答案进行枚举). 思路是:首先对输入数组进行排序, ...
- 使用Spark Streaming + Kudu + Impala构建一个预测引擎
随着用户使用天数的增加,不管你的业务是扩大还是缩减了,为什么你的大数据中心架构保持线性增长的趋势?很明显需要一个稳定的基本架构来保障你的业务线.当你的客户处在休眠期,或者你的业务处在淡季,你增加的计算 ...