posts - 7, comments - 20, trackbacks - 0, articles - 0

导航

公告

学习Spring.NET - IoC对象管理容器(1)

Posted on 2006-12-22 11:09 懒得想 阅读(...) 评论(...) 编辑 收藏

 

Inversion Of Control 控制反转,一种为灵活解决应用内部各部件耦合关系的编程理念,随着Martin Fowler一篇<<Dependency Injection>>为其正名,近年来在JAVA界可说是风起云涌,夸张一点的可以说“不反转控制一下都不好意思说是搞JAVA的",一本Rod Johnson的<<J2EE without EJB>>几乎是JAVA程序员人手一册的红宝书.
当然.NET也未能'幸免于难',虽然没有像Spring.picoContainer那么众多大牌,可也随着Castle这支先遣部队,也让各位.NETer过了一把ioc瘾.
究竟它有什么魔力让众人这么趋之若鹜呢?迟到总比不到好,因此边学边记下笔记.

 

1.新建对象的一般形式

//new function

IDbConnection conn = new SqlConnection(connectionString);

//factory

IDbConnection conn = DbHelper.GetConnection(dbType.SqlServer,connectionString);

//use IoC

IDbConnection conn = context["conn"] as IDbConnection;

<object id="conn" type="System.Data.SqlClient.SqlConnection, System.Data">

<property name="ConnectionString" value="${db.connectionString}" />

</object>

第一种方法大部分情况下可以工作得很好,实施人员可以很方便的在配置文件里修改数据联接,他们挺满意.

不过如果哪一天客户的程序升级,更换为Oracle,那就没折了,只能硬编码修改.

第二种情况,为了应付以后可能出现的需求变更,我们将对象生成以工厂形式提供.

第三种,借助于Spring.NET的对象管理容器,我们可以很方便的在数据库平台之间迁移啦!

 

可能在单个对象的创建方面,IoC容器的功力表现得还不够,再看一个

//use factory

IA a = Factory.GetIA();

IB b = Factory.GetIB(a);

b.Execute();

//use IoC

IB b = context["B"] as IB;

b.Execute();

<object id="B" type="Demo.B, Demo">

<property name="A" ref="a"/>

</object>

<object id="a" type="Demo.A, Demo" />

很明显,用方法1我们要执行IB接口的Execute()方法,必须先得到一份IA接口的实现,可以说IB依赖于IA.

而使用方法2呢,我们只需要从IoC容器中取得一份对象直接执行就好了,IA,IB的实现,以及两者之间的依赖关系都由容器负责维护.孰优孰劣? 不言自明了.

-------------------------------------------------------------------------------------------------------------------------

最后插一句,在使用Spring.NET之前,听着'控制反转','依赖注入'这些学究气十足的名词,都觉得甚得慌.虽然不能说错,但给初学者的感觉真是摸不着头脑,只有举轻若重般的helloworld之后,才恍然大捂,"嗨!原来是这么个东东啊!"