65.9K
CodeProject 正在变化。 阅读更多。
Home

设计模式 IOC 和 DI

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.52/5 (53投票s)

2008年9月17日

CPOL

9分钟阅读

viewsIcon

163085

设计模式 IOC 和 DI

已更新其他应用程序块的链接

目录

引言

我一直在记录和撰写关于设计模式和 UML 的文章。您可以访问我的网站 http://www.questpond.com  了解我的作品。如果您喜欢,请不要忘记给我发送一封电子邮件至 questpond@questpond.com 

在上一篇文章中,我们讨论了 IOC 和 DI 设计模式的基础知识。如果您错过了,可以在以下链接上阅读更多信息:IOCDI.aspx

在同一篇文章中,我们还讨论了如何使用 Windsor 解决这个问题。在本文中,我们将通过一个简单的示例,尝试使用 unity application blocks 实现 DI,从而实现松耦合的架构。
 

您可以在以下链接中阅读我之前关于设计模式和 UML 的文章:-

第一部分 – 设计模式 工厂、抽象工厂、建造者、原型、浅拷贝和深拷贝,以及单例和命令模式

SoftArchInter1.aspx  

第二部分 – 设计模式 解释器、迭代器、中介者、备忘录和观察者模式

SoftArch2.aspx 

第三部分 – 设计模式 状态、策略、访问者、适配器和享元模式

SoftArch3.aspx 

第四部分 - 桥接模式、组合模式、外观模式、责任链、代理模式、模板模式,

SoftArch4.aspx

第一部分 - UML 面试题

SoftArch5.aspx 

第二部分 - UML 面试题

SoftArch6.aspx

您可以从以下网址下载我的架构面试题书:

http://www.questpond.com/softArchi.zip.zip 
 

其他应用程序块

验证应用程序块:- 本文介绍了使用 VAB 进行验证所需的 16 个步骤。验证应用程序块

客户端验证:- VAB 的一个缺点是它只进行服务器端验证。本文介绍了如何利用 VAB 进行客户端验证。客户端验证

动态验证:- 本文介绍了如何基于场景构建动态验证。动态验证

策略应用程序块:- 本文介绍了如何使用策略应用程序块实现即插即用机制。策略应用程序块

日志记录应用程序块:- 本文介绍了使用日志记录应用程序块的 5 个基本步骤。
日志记录应用程序块

数据应用程序:- 本文介绍了实现数据应用程序块所需的四个步骤。
数据应用程序块

异常应用程序块:- 本文介绍了如何使用异常应用程序块记录项目中的异常。异常应用程序块

UIP 块:- 本文介绍了如何使用 Microsoft UIP 块在 Windows 和 Web 应用程序中实现可重用的导航和工作流。UIP 块

 

问题所在 

任何好的架构都建立在组件松耦合的基础上……让我强调一下真正松耦合这一点。让我们通过一个场景来理解这一点,以及我们通常如何使用纯面向对象的方式来解决这个问题。

考虑这样一种情况,我们有一个客户类,需要在数据库中执行插入操作。客户类应可自定义,以便将数据保存到 SQL Server 或 Oracle 数据库中。未来,我们还应该能够添加新的数据库,而不会影响客户类。

以下是我们将要做的。定义两个类,一个用于 SQL Server,一个用于 Oracle。这两个类都继承自某种相同的接口 'Idatabase'。客户类指向这个接口。因此,客户类理论上可以免受 SQL Server 或 Oracle 具体实现的影响。但是,由于对象创建活动需要由客户类完成,因此它仍然需要了解具体的类。
 

图:- 通用的松耦合思维
 

如下图“具体类”所示,实际实现将是这样的。客户类将根据条件创建 Oracle 或 SQL Server 对象。这意味着客户类暴露给具体类,这违背了接口的初衷。数据库类的任何更改都将导致客户类的重新编译。
 

图:- 具体类


创建型模式


接下来想到的是创建型模式。如果我们能引入一个工厂来处理具体类的创建方面,从而将具体类与客户类隔离开来。

以下是工厂模式存在的问题,迫使我们考虑其他解决方案:-

• 一切都是硬编码的:- 工厂最大的问题是它不能在应用程序之间重用。所有选项都在工厂本身中硬编码,这使得工厂对特定实现非常严格。
• 依赖于接口:- 工厂所依赖的基础是通用接口。接口将实现与对象创建过程解耦。但然后所有类都应该实现一个通用接口。这本身又是一个限制。
• 工厂是定制的:- 它们非常适合特定实现。
• 一切都在编译时完成:- 工厂中对象的所有依赖对象都必须在编译时知道。

如果您不熟悉工厂模式,我将不在此解释。您可以在我的上一篇文章 SoftArchInter1.aspx 中阅读相关内容。

好的,我将向您展示一个魔法……而不是编写那些庞大的工厂代码……让我们采用 DI 的方式(依赖注入)。
 

依赖注入


与其编写工厂模式,不如直接将对象注入到客户类中。因此,让客户类引用接口,我们应该能够将具体类型注入到客户类中。通过这样做,客户类不再需要使用 new 关键字,并且完全与具体类解耦。



图:- 依赖注入
 

可以通过容器进行注入。所以基本上,您需要将这两个类都放入容器中,然后容器将创建对象并将其注入到另一个类中。
 


图:- 容器
 

通过这种方式,您的客户类不必担心创建对象和了解具体对象。
 

使用 UNITY 模块解决问题


既然我们知道了容器的好处,我们将探讨 unity application block,它有助于我们实现依赖注入。
 

下载和安装 Unity


第一步是从 http://msdn.microsoft.com/en-us/library/cc468366.aspx 下载 unity application block 并安装。根据您使用的是 2008 还是 2005,文档会有所不同。在本教程中,我将使用 VS 2005,因为大多数专业人士仍然在使用 2005。



图:- unity 模块已安装
 

安装完该模块后,您应该能够在 Microsoft patterns and practices 中看到它。

您需要做的第一件事是获取至少两个组件 Unity 和 Unity configuration 的引用。
 

图:- 添加 Unity 组件的引用
 

在获取了组件的引用后,将“Microsoft.Practices.Unity”命名空间导入到您的代码中,如下图“导入 unity 命名空间”所示。



图:- 导入 unity 命名空间
 

定义通用接口


如前所述,我们应该能够将 SQL Server 数据库对象或 Oracle 数据库对象注入到客户类中。因此,作为一种好的实践,我们将从通用接口 'Idatabase' 继承 SQL Server 实现和 Oracle 实现。
 

图:- 数据库接口
 

提供注入网关


在客户类中,我们将引用接口并使用 [Dependency] 属性公开公共属性。这种公开对于 unity container 是必不可少的。Unity container 需要某种网关来注入对象。所以我们所做的是公开了接口 'iDatabase'。还有很多其他方法可以实现这一点,您可以在我之前的文章中阅读有关为容器提供注入网关的各种方法的介绍 IOCDI.aspx 。



图:- 提供注入网关
 

定义配置文件


为了实现高度定制化,unity application 允许我们在配置文件(web.config 和 app.config)中指定注入的工作方式。由于这个示例是一个 Windows 命令行应用程序,我们将定义一个 app.config 文件。

您可以在下面看到一个来自 unity 视角的 App.config 文件简单模板。Configsection 是必需的,请保持原样。需要注意的重要部分是 types 部分,它位于 container 部分下。在这里,我们指定哪些接口映射到哪个具体类。unity container 根据此部分创建对象,并通过 dependency 属性将其插入到客户对象中。
 

图:- App.config 文件
 

客户端代码


客户端代码非常简单。第一步是创建一个 unity container 对象。第二步是读取 unity 部分。第三步是使用 unity 部分数据配置容器。

第四步,我们告诉容器创建客户对象。这是所有步骤中最重要的一步。在此过程中,容器使用配置文件数据和 dependency 属性将 SQL Server 数据库对象或 Oracle 数据库对象注入到客户类中。此对象创建取决于 app.config 文件中定义的内容。


最后,第五步,我们调用 save 方法。
 

图:- 客户端代码
 

实际的内部工作原理


所以,容器内部发生的事情是,unity container 创建 Oracle 或 SQL Server 数据对象的实例,并通过定义的 dependency 属性将其注入到客户类中。
 

进入真正的松耦合世界
 

因此,如果您定义了 'clsSqlServer' 类,它将创建 'clsSqlServer' 的对象并将其注入到客户类中。如果您定义了 'ClsOracle' 类,它将注入 'clsOracle' 对象。您可以在图“真正的乐趣”中看到,只需修改配置文件中的 type 部分就可以轻松更改实现。
 

图:- 真正的乐趣

 

 

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.