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日说明: 译者认为,本文中所有名词性的"依赖" 都可以理解为 & ...
随机推荐
- 精通SpringBoot--整合druid监控SQL执行
咳咳,今天我们做些简单而实用的东西,使用springboot 整合alibaba的driud数据库监控工具.alibaba已经提供了spring-boot-starter的jar包了.先看pom.xm ...
- pandas知识点(汇总和计算描述统计)
调用DataFrame的sum方法会返还一个含有列的Series: In [5]: df = DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0 ...
- Python9-IO模型-day41
# 进程:启动多个进程,进程之间是由操作系统负责调用# 线程:启动多个线程,真正由被cpu执行的最小单位实际是线程# 开启一个线程,创建一个线程,寄存器.堆栈# 关闭一个线程# 协程# 本质上是一个线 ...
- CMSIS-DAP仿真器_学习(转载)
先给大家普及一下,哈哈.CMSIS-DAP仿真器,是ARM官方做的开源仿真器,没有版权,自由制作.官方给的源代码,使用的是NXP的单片机LPC4320做的.这个源代码,只要你安装了KEIL5,就可以找 ...
- 7、python中的字典
字典是python内置的一种无序.可变的数据结构. 字典也叫哈希表.什么是哈希表?哈希表就是会对表中的键(key)执行哈希计算,并根据计算结果在内存中分配一个区域来储存该键所对应的值(value).这 ...
- Python登录人人网并抓取新鲜事
from sgmllib import SGMLParser import sys,urllib2,urllib,cookielib class spider(SGMLParser): def ...
- 爬虫工程师常用的 Chrome 插件
做多了爬虫都知道,写一个爬虫大部分时间不是在代码上,而是在分析网页上,所有有一套好用的工具可以极大节省劳动力,这里把平时积累的一些 Chrome 插件分享出来,均来自本人和同事推荐,并不定时更新,欢迎 ...
- 创建数据收集器集(DSC)
TechNet 库 Windows Server Windows Server 2008 R2 und Windows Server 2008 按类别提供的 Windows Server 内容 按类别 ...
- Firewall Rule Properties Page: Advanced Tab
Applies To: Windows 7, Windows Server 2008 R2 Use this tab to configure the profiles and interface t ...
- 学好java,做好工程师必读的15本书
学好java,做好工程师必读的15本书 一.Java编程入门类 对于没有Java编程经验的程序员要入门,随便读什么入门书籍都一样,这个阶段需要你快速的掌握Java基础语法和基本用法,宗旨就是“囫囵 ...