您的位置:首页 > 编程语言 > Java开发

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

2006-12-22 11:09 387 查看
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之后,才恍然大捂,"嗨!原来是这么个东东啊!"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: