Microsoft实现的IOC DI之 Unity 、Service Locator、MEF
这几个工具的站点
Microsoft Unity http://unity.codeplex.com
Service Locator http://commonservicelocator.codeplex.com
MEF .net4.0内含,3.x前在codeplex上开源
Utility
The main reasons to use Unity (or any other IoC container) are if:
Ø You have dependencies between your objects .
Ø You need to manage the lifetime of an object .
Ø You want to manage dependencies at runtime, such as cache, constructors, and properties .
Ø You need to intercept the creation of an object .
Unity is a lightweight, extensible dependency injection container that supports interception, constructor injection, property injection, and method call injection. You can use Unity in a variety of different ways to help decouple the components of your applications, to maximize coherence in components, and to simplify design, implementation, testing, and administration of these applications.
Unity is a general-purpose container for use in any type of Microsoft® .NET Framework-based application. It provides all of the features commonly found in dependency injection mechanisms, including methods to register type mappings and object instances, resolve objects, manage object lifetimes, and inject dependent objects into the parameters of constructors and methods and as the value of properties of objects it resolves.
例子
[InjectionConstructor]
public Writer(ILogger logger)
{
this.logger = logger;
}
//Prepare the container
var container = new UnityContainer();
//We specify that the logger to be used is the FileLogger
container.RegisterType<ILogger, FileLogger>();
//and how to instantiate a new Writer
container.RegisterType<Writer>();
//Here Unity knows how to create the new constructor
var writer = container.Resolve<Writer>();
writer.Write("Some Text.");
通过UnityContainer实现注入
Service Locator
例子
/// <summary>
/// Utility to configure the container
/// </summary>
public sealed class UnityContainerConfigurator
{
/// <summary>
/// Configures this instance.
/// </summary>
/// <returns></returns>
public static IUnityContainer Configure()
{
var container = new UnityContainer()
.RegisterType<ILogger, FileLogger>()
.RegisterType<Writer>();
return container;
}
}
// create a new instance of Microsoft Unity container
var provider = new UnityServiceLocator(UnityContainerConfigurator.Configure());
// assign the container to the Service Locator provider
ServiceLocator.SetLocatorProvider(() => provider);
// resolve objects using the service locator
var writer = ServiceLocator.Current.GetInstance<Writer>();
writer.Write("Some Text.");
ServiceLocator的实现非常简单,而且代码也很少
MEF
The main reasons to use MEF are if:
Ø You need to implement external and reusable extensions in your client application, but you might have different implementations in different hosts .
Ø You need to auto-discover the available extensions at runtime .
Ø You need a more powerful and extensible framework than a normal Dependency Injection framework, and you want to get rid of the various boot-strapper and initializer objects .
Ø You need to implement extensibility and/or modularity in your components .
If your application doesn’t require any of the items in these lists, you probably should not implement the IoC pattern, and you might not need to use Unity and MEF .

例子
/// <summary>
/// Logger customized for MEF
/// </summary>
[Export(typeof(ILogger))]
public class MefLogger : ILogger
{
/// <summary>
/// Writes the log.
/// </summary>
/// <param name="message">The message.</param>
public void WriteLog(string message)
{
Console.WriteLine("String built from MEF: {0}.", message);
}
}
/// <summary>
/// Gets or sets the writer.
/// </summary>
/// <value>The writer.</value>
[Import]
public ILogger Writer { get; set; }
public void Run()
{
// first we build the catalog
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssemb
//create the container using the catalog
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
//use the resolved property
Writer.WriteLog("Mef message");
}
简单比较
Service Locator: 最简单的实现形式,对于比较简单的应用合适,本身的实现代码也很简单
Utility:复杂度中等,介于Service Locator和MEF之间
MEF:以一个完整的框架形式展现, .net 4内置支持,提供生命期等各种管理
Microsoft实现的IOC DI之 Unity 、Service Locator、MEF的更多相关文章
- 设计模式之初识IoC/DI(六)
本篇和大家一起学习IoC和DI即控制反转和依赖注入. 当然听上去这词语非常的专业,真不知道是怎么组出来的,看上去难归看上去难,但稍微理解一下也就这么回事了. 首先我们要明白IoC/DI干嘛用的,不然别 ...
- 服务定位器(Service Locator)
服务定位器(Service Locator) 跟DI容器类似,引入Service Locator目的也在于解耦.有许多成熟的设计模式也可用于解耦,但在Web应用上, Service Locator绝对 ...
- 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦
1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...
- Atitit。如何实现dip, di ,ioc ,Service Locator的区别于联系
Atitit.如何实现dip, di ,ioc ,Service Locator的区别于联系 1. Dip原则又来自于松耦合思想方向1 2. 要实现dip原则,有以下俩个模式1 3. Ioc和di的 ...
- 【IOC--Common Service Locator】不依赖于某个具体的IoC
你在你的应用程序应用IoC容器了吗,你是否希望不依赖于某个具体的IoC,微软的模式与实践团队在Codeplex上发布的Common Service Locator.Common Service Loc ...
- 关于依赖注入IOC/DI的感想
之前一直不明白依赖注入有什么好处,甚至觉得它是鸡肋,现在想想,当时真是可笑. 这个想法正如同说接口是没有用处一样. 当整个项目非常庞大,各个方法之间的调用非常复杂,那么,可以想象一下,假设说没有任何的 ...
- IoC/DI
From:http://jinnianshilongnian.iteye.com/blog/1471944 我对IoC/DI的理解 博客分类: spring杂谈 IoCDI IoC IoC: Inv ...
- asp.net core 四 IOC&DI Autofac
其实关于IOC,DI已经有了很多的文章,但是自己在使用中还是有很多困惑,而且相信自己使用下,印象还是会比较深刻的 关于这段时间一直在学习.net core,但是这篇文章是比较重要的,也是我自己觉得学习 ...
- 我对IoC/DI的理解
IoC IoC: Inversion of Control,控制反转, 控制权从应用程序转移到框架(如IoC容器),是框架共有特性 1.为什么需要IoC容器 1.1.应用程序主动控制对象的实例化及依赖 ...
随机推荐
- jquery操作select(取值,设置选中)[转]
每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<select class="selector"></select&g ...
- 20155218 2006-2007-2 《Java程序设计》第5周学习总结
20155218 2006-2007-2 <Java程序设计>第5周学习总结 教材学习内容总结 java中的错误都会被包装成对象,且是可抛出的. 通常称错误处理为异常处理,程序设计本身的错 ...
- nmap - 网络扫描
NMap,Network Mapper 最早是Linux下的网络扫描和嗅探工具包 网络链接扫描; nmap -PT 192.168.1.1-111 # 先ping在扫描主机开放端口 nmap -O 1 ...
- 数位dp(D - How Many Zeroes? LightOJ - 1140 )
题目链接:https://cn.vjudge.net/contest/278036#problem/D 题目大意:T组测试数据,每一次输入两个数,求的是在这个区间里面,有多少个0,比如说19203包括 ...
- 基于FPGA(DDS)的正弦波发生器
记录背景:昨晚快下班时,与同事rk聊起怎么用FPGA实现正弦波的输出.我第一反应是利用高频的PWM波去滤波,但感觉这样的波形精度肯定很差:后来想起之前由看过怎么用FPGA产生正弦波的技术,但怎么都想不 ...
- JAVA 基础基本语法---常量与变量
JAVA 基础基本语法---常量与变量 语法:计算机能够识别的语言的规则: 0. 基本语法 编写Java程序时,应注意以下几点: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hel ...
- Coursera台大机器学习技法课程笔记08-Adaptive Boosting
将分类器组合的过程中,将重点逐渐聚焦于那些被错分的样本点,这种做法背后的数学原因,就是这讲的内容. 在用bootstraping生成g的过程中,由于抽样对不同的g就生成了不同的u,接下来就是不断的调整 ...
- ModelAndView学习笔记
api: 构造函数摘要 ModelAndView() bean样式用法的默认构造函数:填充bean属性,而不是传递构造函数参数. ModelAndView(Object view) ...
- 【转】ElasticSearch之定时删除数据
有的时候我们在使用ES时,由于资源有限或业务需求,我们只想保存最近一段时间的数据,所以有如下脚本可以定时删除数据 delete_es_by_day.sh #!/bin/sh # example: in ...
- Eclipse导入Android项目的方法(转)
原文:http://www.cnblogs.com/SkyD/archive/2010/11/25/1887219.html 看网上流传的Eclipse导入项目的方法都是在新建Android程序时使用 ...
