Castle IOC容器快速入门

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
摘要:IOC模式是近年来非常流行的一种模式,相信大家都不陌生了,如果你还不是很熟悉的话,可以看看Martin Fowler大师的文章[url]http://martinfowler.com/articles/injection.html[/url],网上可以下载到中文版本。在Castle中, Windsor 就是它的一个IOC容器,它构建于MicroKernel之上,功能非常强大。本文将通过一个简单的例子来带你快速走进Castle IOC容器。
 
主要内容
1 .为什么要IOC
2 .什么是Castle IOC容器
3 .快速入门示例
4 .几个重要的概念
 
一,为什么要IOC
IOC (控制反转或者叫依赖注入)Martin Fowler 大师在他的文章中已经讲解的非常精彩了,这里实在不敢班门弄斧,只好简单地解释几句。我们使用 抽象接口来隔离使用者和具体实现之间的依赖关系,但是不管再怎么抽象,最终还是要创建具体实现类的实例,这种创建具体实现类的实例对象就会造成对于具体实现的依赖,为了消除这种创建依赖性,需要把依赖移出到程序的外部(比如配置文件)。使用依赖注入后,这些类完全是基于抽象接口编写而成的,所以可以最大限度地适应需求的变化。依赖注入的形式有三种,分别为构造子注入(Constructor Injection)、设值方法注入(Setter Injection)和接口注入(Interface Injection)。
 
二.什么是Castle IOC容器
Windsor Castle 的一个IOC容器。它构建于MicroKernel之上,功能非常之强大,能检测类并了解使用这些类时需要什么参数,检测类型和类型之间工作依赖性,并提供服务或者发生错误时提供预警的机制。
 
三.快速入门示例
现在假如我们有这样一个需求,开发一个日志组件,把日志信息输出到文本文件,同时对输出的信息进行格式化,以示意性的代码来实现。
1 .新建一个C#工程,添加对以下Dll的引用
Castle.DynamicProxy.dll
Castle.MicroKernel.dll
Castle.Model.dll
Castle.Windsor.dll
2 .编写服务
既然是日志组件,我们先添加两个接口分别为 ILog ILogFormatter,这样的接口我们一般叫做服务,即实现了某种服务的接口(后面会讲到)。
/// <summary>

/// 编写:Terrylee

/// 出处:[url]http://terrylee.cnblogs.com[/url]

/// </summary>


public   interface  ILog

{

    
void Write(string MsgStr);

}

 
/// <summary>

/// 编写:Terrylee

/// 出处:[url]http://terrylee.cnblogs.com[/url]

/// </summary>


public   interface  ILogFormatter

{

    
string Format(string MsgStr);

}

3 .编写组件
仅仅有接口还不行,还需要实现了上面两个接口的具体实现类,这些类我们把它叫做组件。
/// <summary>

/// 编写:Terrylee

/// 出处:[url]http://terrylee.cnblogs.com[/url]

/// </summary>


public   class  TextFileLog : ILog

{

    
private string _target;

    
private ILogFormatter _format;

 

    
public TextFileLog(string target,ILogFormatter format)

    
{

        
this._target = target;

        
this._format = format;

    }


 

    
public void Write(string MsgStr)

    
{

        
string _MsgStr = _format.Format(MsgStr);

        _MsgStr 
+= _target;

        

        
//Output Message

        Console.WriteLine(
"Output "+_MsgStr);

    }


}
 
/// <summary>

/// 编写:Terrylee

/// 出处:[url]http://terrylee.cnblogs.com[/url]

/// </summary>


public   class  TextFormatter : ILogFormatter

{

    
public TextFormatter()

    
{

        

    }


 

    
public string Format(string MsgStr)

    
{

        
return "[" + MsgStr + "]";

    }


}

4 .编写配置文件
编写配置文件,由于 TextFileLog 构造函数中除了需要一个ILogFormatter的实例之外,还需要指定信息的输出的文本文件名,所以编写一个配置文件来指定,这个也可以放在应用程序配置文件中(Web.config或者App.config)。
<? xml version="1.0" encoding="utf-8"  ?>

< configuration >

    
< components >

        
< component  id ="txtLog" >

            
< parameters >

                
< target > log.txt </ target >

            
</ parameters >

        
</ component >

    
</ components >

</ configuration >
 
5 .使用Castle IOC容器
前面的几步仅仅是为我们Castle IOC做准备,下面就是正式使用了。使用Castle IOC容器非常简单,基本上分为建立容器,加入组件,获取组件,使用组件几个步骤。
 
/// <summary>

/// 编写:Terrylee

/// 出处:[url]http://terrylee.cnblogs.com[/url]

/// </summary>


public   class  App

{

    
public static void Main()

    
{

        
//建立容器

        IWindsorContainer container 
= new WindsorContainer( new XmlInterpreter("../../BasicUsage.xml") );

        

        
//加入组件

        container.AddComponent( 
"txtLog"

            
typeof(ILog), typeof(TextFileLog) );

 

        container.AddComponent( 
"format"

            
typeof(ILogFormatter), typeof(TextFormatter) );

 

        
//获取组件

        ILog log 
= (ILog) container["txtLog"];

 

        
//使用组件

        log.Write(
"First Castle IOC Demo");

        

        Console.ReadLine();

    }


}
简单的描述一下:
第一步:注册了一个Windsor容器;
第二步:向容器中注册ILog服务,并告诉容器TextFileLog实现了这个服务,这里还设置了一个key的参数,后面可以通过这个参数来获取这个服务,注册ILog时容器会发现这个服务依赖于其他的服务,它会自动去寻找,如果找不到这样的服务,则会抛出一个异常;
第三步:向容器中注册ILogFormatter并告知TextFormatter实现了它;
第四步:容器发现类的构造函数还需要另外一个参数target,这里指定了到BasicUsage.xml中去查找。
运行程序,可以看到输出的结果:
Output [First Castle IOC Demo]log.txt
怎么样?够简单的吧。 可以看到整个过程非常的简单,代码也非常优雅,我们并没有使用new关键字创建一个具体实现类的实例, 至此,一个简单的使用Castle IOC的过程就完成了。下面我们来理解一下其中几个重要的概念。
四.几个重要的概念
1 .服务
服务是一个个的接口,接口约定了服务,从而使随意替换服务的实现对使用接口服务的代码没有任何的影响。像我们上面例子中的ILogILogFormatter都是一个个服务,我们在这个例子中支实现了一个文本文件的日志记录,如果你要是实现数据库记录的日志记录,都必须要遵守ILog这个接口。
2 .组件
简单来说组件是一个可重用的程序单元,它实现了某个接口,并仅仅只实现了这一个良好的接口。也就是说,组件是实现了某个服务接口的类。像上例中的 TextFileLog TextFormatter都是组件
3 .自动装配
在上面的例子中,大家可能都已经注意到了,TextFileLog依赖于TextFormatter,我们却没有在配置文件中指定它们之间的依赖关系,这就是Castle IOC聪明的一个地方,它能够自动管理组件之间的依赖关系,而无需编写特定的xml config来配置,即自动装配的意思。
 
Castle IOC 容器快速入门指南就到这儿,欢迎大家多多指教,后续文章我会详细的去写Castle IOC及其Facility文中完整的程序:下载
 
参考资料














本文转自lihuijun51CTO博客,原文链接:  http://blog.51cto.com/terrylee/67671 ,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
8月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
5月前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
7月前
|
存储 Docker 容器
containerd容器运行时快速入门使用指南
关于containerd容器运行时的快速入门使用指南,涵盖了镜像管理、容器管理、NameSpace管理、数据持久化、镜像推送至Harbor仓库以及Docker与Containerd集成等内容。
545 1
containerd容器运行时快速入门使用指南
|
7月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
357 3
|
6月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
145 0
|
8月前
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
8月前
|
XML Java 数据格式
Spring5入门到实战------2、IOC容器底层原理
这篇文章深入探讨了Spring5框架中的IOC容器,包括IOC的概念、底层原理、以及BeanFactory接口和ApplicationContext接口的介绍。文章通过图解和实例代码,解释了IOC如何通过工厂模式和反射机制实现对象的创建和管理,以及如何降低代码耦合度,提高开发效率。
Spring5入门到实战------2、IOC容器底层原理
|
8月前
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式
|
26天前
|
Ubuntu 关系型数据库 MySQL
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
86 16
|
1月前
|
监控 关系型数据库 MySQL
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
132 30