Castle学习笔记----初探IOC容器
通常IOC实现的步骤为-->建立容器-->加入组件-->获取组件-->使用组件.
1.建立容器
建立容器也就是IWindsorContainer.接着我门要向容器中注册服务,并告诉容器所注册的服务由那一个类来实现他.通常建立容器我们可以用以下定义来实现:
1
|
1IWindsorContainer container = new WindsorContainer(); |
2.加入组件
向建立好的容器里加入组件,直接调用容器的AddComponent()来完成.比如现在有一个写日志的接口ILog,实现这个服务的组件是TextLog,那我门可以通过如下方法把该组件加入到容器:
1
|
1container.AddComponent("txtLog", typeof(ILog), typeof(TextLog)); |
3.获取组件
获取组件可以直接通过加入组件的时候使用的key来获取,返回的是一个IWindsorContainer,这里需要一个强制转换.
1
|
1ILog log = (ILog)container["txtLog"]; |
4.使用组件
1//把当前时间写入到日志文件去
2log.Write(DateTime.Now.ToShortDateString()); 上面就是一个IOC容器的工作过程,从创建容器--加入组件--获取组件--使用组件.下面我看来看看一个小实例,也就是我在学习IOC的时候结合网上的资源自己小试牛刀瞎写的.
-------------------------------------------------------------------------------------------------------------
ILog接口(服务)的定义:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace IOCDayOne 6{ 7 /**//// < summary > 8 /// 日志服务 9 /// </ summary > 10 public interface ILog 11 { 12 /**//// < summary > 13 /// 写日志方法 14 /// </ summary > 15 /// < param name = "msgStr" >日志内容</ param > 16 void Write(string msgStr); 17 } 18} 19 |
TextLog组件的定义:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
1namespace IOCDayOne 2{ 3 /**//// < summary > 4 /// ILog服务的组件 5 /// </ summary > 6 public class TextFileLog:ILog 7 { 8 private string _target; //私有成员 9 private ILogFormat _format; //ILogFormat一内聚的方式存在 10 11 /**//// < summary > 12 /// 构造方法 13 /// </ summary > 14 /// < param name = "target" >标识</ param > 15 /// < param name = "format" >提供格式化服务的接口</ param > 16 public TextFileLog(string target, ILogFormat format) 17 { 18 this._target = target; 19 this._format = format; 20 } 21 22 /**//// < summary > 23 /// 写日志的实现方法 24 /// </ summary > 25 /// < param name = "msgStr" >日志内容</ param > 26 public void Write(string msgStr) 27 { 28 string str = _format.Format(msgStr); //格式化日志 29 str += _target; //日志内容为格式化后的字符+类构造时传入的标识参数 30 31 //下面将日志记录到文本文件 32 FileStream fs = new FileStream(this._target, FileMode.Append); 33 StreamWriter sw = new StreamWriter(fs, Encoding.Default); 34 sw.WriteLine("Log:-->" + str); 35 sw.Close(); 36 } 37 } 38} |
XML配置文件的定义(指定将日志记录到C:Log.txt),TextLog组件需要存储路径的参数,我们在建立IOC容器的时候指定容器到这个配置文件中来找"target":
1
2
3
4
5
6
7
8
9
10
11
|
1<? xml version = "1.0" encoding = "utf-8" ?> 2< configuration > 3 < components > 4 < component id = "txtLog" > 5 < parameters > 6 < target >C:Log.txt</ target > 7 </ parameters > 8 </ component > 9 </ components > 10</ configuration > 11 |
出此之外还有一个格式化日志的服务IlogFormat,可将日志格式化为一定的格式输出,定义如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
1namespace IOCDayOne 2{ 3 /**//// < summary > 4 /// 格式化日志服务接口 5 /// </ summary > 6 public interface ILogFormat 7 { 8 /**//// < summary > 9 /// 格式化日志方法 10 /// </ summary > 11 /// < param name = "msgStr" >日志内容</ param > 12 /// < returns ></ returns > 13 string Format(string msgStr); 14 } 15} |
实现ILogFormat服务的组件定义为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
1namespace IOCDayOne 2{ 3 public class TextFormat:ILogFormat 4 { 5 /**//// < summary > 6 /// 格式化日志内容 7 /// </ summary > 8 /// < param name = "msgStr" >日志内容</ param > 9 /// < returns ></ returns > 10 public string Format(string msgStr) 11 { 12 return "On:" + msgStr; 13 } 14 } 15} |
到这里,来写个测试方法测试看看.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
1namespace IOCDayOne 2{ 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //建立容器 8 IWindsorContainer container = new WindsorContainer(new XmlInterpreter("< a href = ""http://www.cnblogs.com/Config/ConfigBase.xml/"" >http://www.cnblogs.com/Config/ConfigBase.xml</ a >")); 9 //加入组件 10 container.AddComponent("txtLog", typeof(ILog), typeof(TextFileLog)); 11 container.AddComponent("format", typeof(ILogFormat), typeof(TextFormat)); 12 //获取组件 13 ILog log = (ILog)container["txtLog"]; 14 //使用组件 15 log.Write(DateTime.Now.ToShortDateString()); 16 } 17 } 18} |
测试输出的结果为:
1
|
Log:-->On:2008-4-3C:Log.txt |
上面的main()中可以看书,在使用组件的时候只传递了一个参数(日志内容),而实现ILog服务的组件的构造方法是需要两个参数,
1
2
3
4
5
6
7
8
9
10
|
1/**//// < summary > 2/// 构造方法 3/// </ summary > 4/// < param name = "target" >标识</ param > 5/// < param name = "format" >提供格式化服务的接口</ param > 6public TextFileLog(string target, ILogFormat format) 7{ 8 this._target = target; 9 this._format = format; 10} |
在前面向容器中注册ILog服务的时候,告诉容器TextFileLog实现了这个服务,这里还设置了一个key的参数,后面可以通过这个参数来获取这个服务,注册ILog时容器会发现这个服务依赖于其他的服务,它会自动去寻找,如果找不到这样的服务,则会抛出一个异常.
到这里,一个IOC的完整实例就完成了.其实还有另外一种方式实现.详细见下面.
-------------------------------------------------------------------------------------------------------------
上面是通过把配置写到XML的,而组件与服务是直接通过容器的加入组件来完成匹配.这样显然是不够灵活的,一单需求发生了变化,实现ILog服务的组件不在是TextFileLog的时候又该怎么处理呢?我们又去修改加入组件时的程序代码来实现,这样是可以达到需求的,但是这样做很明显不够灵活.那怎么做才能让服务去调用具体的实现组件修改方便呢?另一种方式是通过配置文件(App.config/Web.config)来实现.
下面是针对上面这个实例定义的App.config配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
1<? xml version = "1.0" encoding = "utf-8" ?> 2< configuration > 3 < configSections > 4 < section name = "castle" type = "Castle.Windsor.Configuration.AppDomain.CastleSectionHandler,Castle.Windsor" /> 5 </ configSections > 6 < castle > 7 < components > 8 < component id = "txtLog" service = "IOCDayOne.ILog,IOCDayOne" type = "IOCDayOne.TextFileLog,IOCDayOne" > 9 < parameters > 10 < target >C:Log.txt</ target > 11 </ parameters > 12 </ component > 13 < component id = "format" service = "IOCDayOne.ILogFormat,IOCDayOne" type = "IOCDayOne.TextFormat,IOCDayOne" > 14 < paramters > 15 < target >DayOne</ target > 16 </ paramters > 17 </ component > 18 </ components > 19 </ castle > 20</ configuration > |
这时,测试方法就需要改动下了,通过配置文件来完成IOC,详细如下:
Castle学习笔记----初探IOC容器的更多相关文章
- Go学习笔记06-内建容器
Go学习笔记06-内建容器 Go语言 数组 *切片(Slice) #F44336 Slice的操作 Map map示例 字符处理 数组 定义数组: //这样定义数组编译器自动初始化每个元素为0 va ...
- Spring学习笔记--Spring IOC
沿着我们上一篇的学习笔记,我们继续通过代码学习IOC这一设计思想. 6.Hello类 第一步:首先创建一个类Hello package cn.sxt.bean; public class Hello ...
- Spring学习笔记1——IOC: 尽量使用注解以及java代码(转)
在实战中学习Spring,本系列的最终目的是完成一个实现用户注册登录功能的项目. 预想的基本流程如下: 1.用户网站注册,填写用户名.密码.email.手机号信息,后台存入数据库后返回ok.(学习IO ...
- Spring学习笔记1——IOC: 尽量使用注解以及java代码
在实战中学习Spring,本系列的最终目的是完成一个实现用户注册登录功能的项目. 预想的基本流程如下: 1.用户网站注册,填写用户名.密码.email.手机号信息,后台存入数据库后返回ok.(学习IO ...
- Spring.net(二)----初探IOC容器
我在上一篇关于Spring.net的文章“Spring.NET框架简介及模块说明 ”中很详细的介绍了,本文就不旧话从提.我门就直奔主题吧. 1.首先了解两个接口. IObjectFactory接口和 ...
- spring源码学习之路---IOC容器初始化要义之bean定义载入(五)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,时间不多,研究 ...
- 6. Laravel5学习笔记:IOC/DI的理解
介绍 IOC 控制反转 Inversion of Control 依赖关系的转移 依赖抽象而非实践 DI 依赖注入 Dependency Injection 不必自己在代码中维护对象的依赖 容器自己主 ...
- Spring学习记录1——IoC容器
IoC容器 1.1 IoC概述 Ioc(Inverse of Control,控制反转)是Spring容器的内核.对于软件来说,即某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定,即由 ...
- Spring学习一: Ioc容器
Spring 容器: Spring 容器是Spring框架的核心.Spring容器将创建Bean对象实例,把它们联系在一起,配置它们,并管理它们整个生命周期从创建到销毁.Spring 容器通 ...
随机推荐
- CodeIgniter的缓存设置
数据库缓存 数据库缓存类允许你把数据库查询结果保存在文本文件中以减少数据库访问. 激活缓存需要三步: 在服务器上创建一个可写的目录以便保存缓存文件. 在文件 application/config/da ...
- 20160206.CCPP体系详解(0016天)
代码片段(01):.指针.c+02.间接赋值.c 内容概要:内存 ///01.指针 #include <stdio.h> #include <stdlib.h> //01.取地 ...
- python练习程序(c100经典例11)
题目: 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? a=1;b=1 print a,b, for i ...
- hibernate不关闭session后果
(转自:百度知道) 看是怎么获得session的. 方法1: 通过配置监听器后,在Dao中用getCurrentSession获取(内部原理....),此时无需管理session的关闭与否: 方法2: ...
- PHP实现站点pv,uv统计(二)
数据采集脚本如下: error_reporting(0);date_default_timezone_set("PRC");$environment = get_cfg_var(' ...
- mysql 查看所有存储过程
转载地址:http://zhuixue.iteye.com/blog/375353 查询数据库中的存储过程 方法一: select `name` from mysql.proc where db = ...
- Android下实现win8的按钮点击效果
原理就是自定义一个imageButton,实现动画效果 demo源码下载地址: 请戳这里----------------> 关于回弹张力的效果扩展,可以参考Facebook的开源动画库rebo ...
- hadoop完全分布式模式的安装和配置
本文是将三台电脑用路由器搭建本地局域网,系统为centos6.5,已经实验验证,搭建成功. 一.设置静态IP&修改主机名&关闭防火墙(all-root)(对三台电脑都需要进行操作) 0 ...
- PHP include()和require()方法的区别
本文总结了PHP的include()和require()两种包含外部文件的方法的不同之处.基本上就是,加载失败的处理方法,性能,以及使用弹性方面的不同. PHP的include()和require() ...
- 关于“怎么比较两个SQL查询语句产生的结果集是否相同”搜集到的一些资料
一. 如果你这两个结果集都没有close,可以这样: rs.last(); rs2.last(); if (rs.getRow() != rs2.getRow()) { //记录数不等,即结果不等 } ...