.net IOC模式(转自http://book.51cto.com/art/200803/67575.htm)

2023-10-31 05:38

本文主要是介绍.net IOC模式(转自http://book.51cto.com/art/200803/67575.htm),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2011-09-02 15:17

  控制反转IOC和依赖注入DI

控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)基本上是一个意思。不过Martin Fowler在名为《Inversion of Control Containers and the Dependency Injection pattern》的文章中提到,IOC是一个大而化之的概念,因此它倾向于使用DI来介绍这种新模式。所以,下文都将使用依赖注入(DI)来指代这种模式,同时会把实现这种新模式的框架(程序库)按照惯例说成IOC容器。

DI的出现是基于分离关注( Separation of Concerns : SOC)这个原始动力的,同样下面章节要讲到的面向方面编程(Aspect Oriented Programming,AOP)的原始动力。

通过学习GoF设计模式,我们已经习惯一种思维编程方式:接口驱动(Interface Driven Design,IDD),接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等,但是接口一定是需要实现的,也就是如下语句迟早要执行:

IMyClass a = new MyClass();

MyClass是接口IMyClass的一个实现类,而DI模式可以延缓接口的实现,根据需要实现,有个比喻:接口如同空的模型套,在必要时,需要向模型套注射石膏,这样才能成为一个模型实体,因此,我们将人为控制接口的实现成为“注射”。这种方式就是著名的所谓的好莱坞理论:你待着别动,到时我会找你。

下面用一个简单的例子来说明这种模式。这个例子有一个MovieLister类,有一个MoviesDirectedBy的方法根据输入的导演名称来得到所有此导演的电影。

class MovieLister
{
public Movie[] MoviesDirectedBy(string name)
{
IList<Movie> allMovies = finder.FindAll();
List<Movie> lst = new List<Movie>();
foreach (Movie m in allMovies)
{
if (m.Director == name) lst.Add(m);
}
return lst.ToArray();
}
}

通过在MovieLister中使用finder对象,MoviesDirectedBy方法的完成可以不用考虑电影列表的实际存储方式。因而需要认真处理如何把MovieLister对象和finder对象连接起来的问题。首先给finder定义一个接口:

    interface IMovieFinder
{
IList<Movie> FindAll();
}

并实现一个简单的MovieFinder:

    class SimpleMovieFinder:IMovieFinder
{
#region IMovieFinder Members
public IList<Movie> FindAll()
{
List<Movie> lst = new List<Movie>();
Movie m;
for (int i = 0; i < 2; i++)
{
m = new Movie();
m.Director = "Zyg";
lst.Add(m);
}
for (int i = 0; i < 3; i++)
{
m = new Movie();
m.Director = "Kevin";
lst.Add(m);
}
return lst;
}
#endregion
}
现在把MovieFinder和MovieLister耦合起来:
class MovieLister
{
private IMovieFinder finder;
public MovieLister()
{
finder = new SimpleMovieFinder();
}

上面的耦合方式是一种紧耦合方式,如果想把电影列表保存在文本文件或者数据库中,那么在实现类似TextFileMovieFinder类或者 SqlServerMovieFinder类之后,如何不改变MovieLister的代码,而方便地切换到不同的数据源呢?所以依赖注入就是这样一种机制:MovieFinder的实现类不是在编译期连入程序之中的,而是允许在运行期插入具体的实现类,插入动作完全脱离原作者的控制。我们可以把后期插入的这些实现类统称为插件。实际上,要实现这种效果,不一定要依靠依赖注入,使用Service Locator模式也可获得同样的效果。

为了使应用程序获得依赖注入这种特性,一般情况下都会利用一些现成的IOC容器(框架)来实现。后文,会介绍如何使用Castle项目的IOC容器来解决我们这个电影列表的依赖问题。

依赖注入有三种基本的形式:

1.构造器注入(Constructor Injection),即通过构造方法完成依赖关系。如:

public class Sport
{
private InterfaceBall ball;
public Sport(InterfaceBall arg)
{
ball = arg;
}
}

2.设值方法注入(Setter Injection),在类中暴露setter方法来实现依赖关系。如:

public class Sport
{
private InterfaceBall ball;
public void setBall(InterfaceBall arg)
{
ball = arg;
}
}

3.接口注入(Interface Injection),利用接口将调用者与实现者分离。如:

public class Sport
{
private InterfaceBall ball; //InterfaceBall是定义的接口
public void init()
{
//Basketball实现了InterfaceBall接口
ball = (InterfaceBall) Class.forName("Basketball").newInstance();
}
}

Sport类在编译期依赖于InterfaceBall的实现,为了将调用者与实现者分离,我们动态生成Basketball类并将强制类型转换为 InterfaceBall。

这篇关于.net IOC模式(转自http://book.51cto.com/art/200803/67575.htm)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/313187

相关文章

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr