Unity依赖注入容器
发布: 2009-3-31 12:31 | 作者: softworker | 来源: 青软培训-踏踏实实育人-勤勤恳恳奉献
objectbuilder是一个可扩展的application block,同时也是unity的基础。对于objectbuilder到底是什么有很多不同的理解,最普遍的描述是:objectbuilder是“依赖注入的工具”,还有一种说法是“构建依赖注入容器的框架”,这些多少都有些出入。应该说objectbuilder是一个可配置的对象工厂。
objectbuilder有两个版本,习惯称之为ob1和ob2。ob1在objectbuilder的网站上就可以down,ob2可以说目前只流传于民间:)为什么这么说?因为目前只能从unity的ctp版本中或者sample中得到,估计是会跟随unity的release一块儿发布。
对于ob1,黄忠成先生的object builder application block系列写得清晰透彻,当然,经过吕震宇先生的简体翻译:[转]object builder application block,可读性更上一层楼了。
ob2在ob1的基础上可以说有了很大的改动,这里可以参考chris的最新的一些blog,顺带说一句,这些blog读起来就要费些脑筋了,如果你不是真的想对objectbuilder弄个门清的话,那其实理解一下黄忠成先生文章中提到的一些概念和思想就足够了。
unity是什么?
unity是patterns & practices团队开发的一个轻量级、可扩展的依赖注入容器,具有如下的特性:
1. 它提供了创建(或者装配)对象实例的机制,而这些对象实例可能还包含了其它被依赖的对象实例。
2. unity允许将预先配置的对象注入到类中,实现了inversion of control (ioc)的功能。在unity中,支持constructor injection(构造器注入), property setter injection(属性设值注入)以及method call injection(方法注入)。ps:这里的方法注入与martin fowler定义的接口注入类似而稍有区别。
3. 支持容器的体系结构。一个容器可以有子容器,允许从子容器到父容器的对象定位查询。
4. 可以通过配置文件进行准备和配置容器。
5. 不会影响到类的定义(属性设值注入和方法注入除外),这也是轻量级容器的一个体现。
6. 支持自定义的容器扩展。
使用unity,最基本步骤有三步。
1. 建立容器;
2. 将接口与类的映射注册到容器中;
3. 从容器中解析出正确的对象。
例子:
step0. 准备工作
ilogger接口:
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101827219.png" onload="return imgzoom(this,550);" border="0" />
consolelogger类:
<img style="width: 431px; cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101827137.png" onload="return imgzoom(this,550);" border="0" />
nulllogger类:
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101827125.png" onload="return imgzoom(this,550);" border="0" />
step1. 创建容器
在unity中创建容器实例最简单的方法是直接使用构造函数创建,如下代码所示:
iunitycontainer container = new unitycontainer();
step2. 注册接口映射
在unity中提供了一组register方法供我们在容器中注册接口映射,如下代码所示:
container.registertype<ilogger, consolelogger>();
step3. 获取对象实例
在unity中提供了一组resolve方法用以获取对象实例,如下代码所示:
ilogger logger = container.resolve<ilogger>();
ok,就这么简单!
测试:
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101828471.png" onload="return imgzoom(this,550);" border="0" />
场景一:注册一个consolelogger作为ilogger的实现到容器中,然后从容器中解析ilogger的实现,并调用ilogger的log方法。
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101828505.png" onload="return imgzoom(this,550);" border="0" />
结果:
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101828333.png" onload="return imgzoom(this,550);" border="0" />
场景二:注册一个nulllogger作为ilogger的实现到容器中,然后从容器中解析ilogger的实现,并调用ilogger的log方法。
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101828645.png" onload="return imgzoom(this,550);" border="0" />
结果:
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101828789.png" onload="return imgzoom(this,550);" border="0" />
objectbuilder有两个版本,习惯称之为ob1和ob2。ob1在objectbuilder的网站上就可以down,ob2可以说目前只流传于民间:)为什么这么说?因为目前只能从unity的ctp版本中或者sample中得到,估计是会跟随unity的release一块儿发布。
对于ob1,黄忠成先生的object builder application block系列写得清晰透彻,当然,经过吕震宇先生的简体翻译:[转]object builder application block,可读性更上一层楼了。
ob2在ob1的基础上可以说有了很大的改动,这里可以参考chris的最新的一些blog,顺带说一句,这些blog读起来就要费些脑筋了,如果你不是真的想对objectbuilder弄个门清的话,那其实理解一下黄忠成先生文章中提到的一些概念和思想就足够了。
unity是什么?
unity是patterns & practices团队开发的一个轻量级、可扩展的依赖注入容器,具有如下的特性:
1. 它提供了创建(或者装配)对象实例的机制,而这些对象实例可能还包含了其它被依赖的对象实例。
2. unity允许将预先配置的对象注入到类中,实现了inversion of control (ioc)的功能。在unity中,支持constructor injection(构造器注入), property setter injection(属性设值注入)以及method call injection(方法注入)。ps:这里的方法注入与martin fowler定义的接口注入类似而稍有区别。
3. 支持容器的体系结构。一个容器可以有子容器,允许从子容器到父容器的对象定位查询。
4. 可以通过配置文件进行准备和配置容器。
5. 不会影响到类的定义(属性设值注入和方法注入除外),这也是轻量级容器的一个体现。
6. 支持自定义的容器扩展。
使用unity,最基本步骤有三步。
1. 建立容器;
2. 将接口与类的映射注册到容器中;
3. 从容器中解析出正确的对象。
例子:
step0. 准备工作
ilogger接口:
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101827219.png" onload="return imgzoom(this,550);" border="0" />
consolelogger类:
<img style="width: 431px; cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101827137.png" onload="return imgzoom(this,550);" border="0" />
nulllogger类:
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101827125.png" onload="return imgzoom(this,550);" border="0" />
step1. 创建容器
在unity中创建容器实例最简单的方法是直接使用构造函数创建,如下代码所示:
iunitycontainer container = new unitycontainer();
step2. 注册接口映射
在unity中提供了一组register方法供我们在容器中注册接口映射,如下代码所示:
container.registertype<ilogger, consolelogger>();
step3. 获取对象实例
在unity中提供了一组resolve方法用以获取对象实例,如下代码所示:
ilogger logger = container.resolve<ilogger>();
ok,就这么简单!
测试:
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101828471.png" onload="return imgzoom(this,550);" border="0" />
场景一:注册一个consolelogger作为ilogger的实现到容器中,然后从容器中解析ilogger的实现,并调用ilogger的log方法。
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101828505.png" onload="return imgzoom(this,550);" border="0" />
结果:
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101828333.png" onload="return imgzoom(this,550);" border="0" />
场景二:注册一个nulllogger作为ilogger的实现到容器中,然后从容器中解析ilogger的实现,并调用ilogger的log方法。
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101828645.png" onload="return imgzoom(this,550);" border="0" />
结果:
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="unity(三):快速入门" src="http://www.ymdg.net/article/uploadpic/2009-1/2009121101828789.png" onload="return imgzoom(this,550);" border="0" />




