Framework之外的IoC

IoC (Inversion of Control)是什么?软件设计大师已经作出了很多定义。这里,我从组件开发的角度来谈什么是IoC-“IoC是一种设计模式,当系统由多个组件(Component)构成时,它能消除组件间的直接依赖关系,让组件的开发更独立,使用更灵活”。

IoC是Framework的基本特征,但IoC并不专属于Framework设计范畴,它在需要消除组件依赖的地方都能发挥作用。

下面举一个开发实例:需要开发一个计算器组件,实现整数加法运算,计算过程将记录log。


针对上面的需求 ,我们开发第1版的程序:

Code


上面的程序编译成组件Calculator.dll,它将引用另一个组件Log.dll(可能为第三方,也可能是自己开发)。这样做的问题在于:

a. Calculator.dll对Log.dll是直接依赖关系,缺少Log.dll,Calculator的开发无法独立进行;

b. 如果其他组件User.dll需要使用Calculator的功能,它除了引用Calculator.dll外,还必须引用Log.dll。User.dll可能只需要Calculator的加法功能,不需要记录log,或者是希望把log重定向到其他地方,但Log依赖被牢牢钉在了Calculator内部,造成了User.dll使用Calculator不方便。

通过IoC,我们来解决上面的问题,下面是第2版:

Code


从代码中看到,Calculator依然拥有Log逻辑,但它不再直接依赖Log.dll了,它把对具体Log的依赖选择权交给了User.dll:

Code


通过IoC,在第2版中Calculator的开发变得独立;对Calculator的使用变得灵活。

进一步的思考:为什么Calculator内部不采用interface,而是delegate来表达Log功能?如果采用interface存在怎样的问题?有兴趣的朋友可以从实际开发使用的角度探讨!

文章开篇定义了IoC,最后再从依赖抽象和具体依赖建立的角度定义IoC:“IoC是一种设计模式,符合IoC模式的组件通过接口或委托等方式对依赖进行抽象,消除对其他组件的直接依赖,而具体的依赖关系由组件的使用者负责建立”。





(文/weidagang2046  出处/博客园)

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Visual Studio.NET] 的这些文章也感兴趣:

初探SharePoint部署 – WSS Solution Package
创建基于ASP.NET的SMTP邮件服务
NCache:最新发布的.NET平台分布式缓存系统
深入学习heritrix---体系结构(Overview of the crawler)
.Net Framework框架源码学习(第二篇 单件模式)
LiveRun——让REPL更进一步
如何创建Code Snippet
.Net Micro Framework 模拟器详解 – 基本原理
Download Links for Mix08 Technologies
Expression Studio 2.0 中文版发布了