您的位置:首页 > 其它

Castle IOC容器构建配置详解(二)

2006-04-24 09:58 483 查看
摘要:在前一篇文章中我们并没有考虑配置的组件参数是什么类型,也没有在配置文件中指定过类型,那么Castle IOC是如何进行类型转换的?如何配置一些复杂的数据类型?如果有自定义的类型如何去进行类型转换?本文将进行一一解答这些问题。

主要内容[/b]

1.基本类型配置

2.Array类型配置

3.List类型配置

4.Dictionary类型配置

5.自定义类型转换

一.基本类型配置[/b]

在Castle IOC的配置文件中,大家可能都已经注意一个问题了,就是不管组件接收的是什么基本数据类型,我们一律没有在配置文件中指定,也就是说,不管组件接收的类型是int型或者是String类型,我们都可以这样去配置:

<component id="MyComponent">

<parameters>

<port>10</port>

</parameters>

</component>
这是因为在Castle IOC中,MicroKernel中的SubSystem中有一个TypeConverter,它专门负责类型的转换。参数的注入一般都是通过构造函数或者公有的属性,基本数据类型在配置文件我们不需要用专门的节点去配置,但是对于一些复杂的数据类型久有些不一样。目前Castle IOC能够支持的数据类型如下。

类型[/b]

节点[/b]

示例[/b]

System.Int32, Int16, Int64

-

<parameters>

<port>10</port>

</parameters>

System.UInt32, UInt16, UInt64

-

<parameters>

<port>10</port>

</parameters>

System.Char

-

<parameters>

<letter>a</letter>

</parameters>

System.Single, Double, Decimal

-

<parameters>

<threshold>13.22</threshold>

</parameters>

System.String

-

<parameters>

<server>mail.host.com</server>

</parameters>

System.Byte, SByte

-

<parameters>

<rcolor>144</rcolor>

</parameters>

System.Boolean

-

<parameters>

<enabled>0</enabled>

</parameters>

System.DateTime

-

<parameters>

<initial>11022005</initial>

</parameters>

System.Type

-

<parameters>

<type>Components.MyComponent, Components</type>

</parameters>

System.Array

array

参见后面

System.Collections.IList

list

参见后面

System.Collections.IDictionary

dictionary

参见后面

如果有其它的类型,我们需要编写自定义的TypeConverter。

二.Array类型配置[/b]

组件构造函数有一个Array的参数

// 出处:http://terrylee.cnblogs.com
public class MyComponent
<!--出处:http://terrylee.cnblogs.com-->

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<component id="e" type="CastleDemo.MyComponent,CastleDemo">

<parameters>

<Orders>

<item type="System.Int32">

<item>1</item>

<item>2</item>

<item>3</item>

</item>

</Orders>

</parameters>

</component>

</configuration>
三.List类型配置[/b]

组件构造函数有一个IList类型的参数

//出处:http://terrylee.cnblogs.com
public class MyComponent
<!--出处:http://terrylee.cnblogs.com-->

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<component id="mycomponent" type="CastleDemo.MyComponent,CastleDemo">

<parameters>

<hosts>

<list type="System.String">

<item>server1</item>

<item>server2</item>

<item>server3</item>

<item>server4</item>

</list>

</hosts>

</parameters>

</component>

</configuration>
四.Dictionary类型配置[/b]

组件构造函数有一个Idictionary类型的参数

//出处:http://terrylee.cnblogs.com
public class MyComponent
<!--出处:http://terrylee.cnblogs.com-->

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<component id="MyComponent" type="CastleDemo.MyComponent,CastleDemo">

<parameters>

<d>

<dictionary>

<entry key="a">a</entry>

<entry key="b">b</entry>

<entry key="c">c</entry>

</dictionary>

</d>

</parameters>

</component>

</configuration>
或者我们可以在配置文件中分别指定Key和Value的数据类型,分别使用keyType和valueType。

<!--出处:http://terrylee.cnblogs.com-->

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<component id="MyComponent" type="CastleDemo.MyComponent,CastleDemo">

<parameters>

<d>

<dictionary keyType="System.String, mscorlib" valueType="System.String, mscorlib">

<entry key="a">a</entry>

<entry key="b">b</entry>

<entry key="c">c</entry>

</dictionary>

</d>

</parameters>

</component>

</configuration>

五.自定义类型转换[/b]

要实现我们自定义的类型转换,在这之前我们还是花一点时间来看看Castle IOC中是如何实现类型的转换的。在SubSystems中有一个Conversion,专门负责类型的转换,通过一个类型转换器ConversionManager来实现对类型转换的管理,在DefaultConversionManager初始化的时候,会加载以下几个类型转换:

protected virtual void InitDefaultConverters()
public class PrimitiveConverter : AbstractTypeConverter
//出处:http://terrylee.cnblogs.com
public class MyTypeConverter : ITypeConverter
IKernel kernel = new DefaultKernel();

IConversionManager conversionMng = (IConversionManager)

kernel.GetSubSystem( SubSystemConstants.ConversionManagerKey );

conversionMng.Add(new MyTypeConverter());

关于Castle IOC容器中构建配置信息就到这里了,我总共分为了一,二两部分来讲解。Castle IOC系列的文章后续还有很多,希望大家继续关注!

参考资料[/b]

Castle的官方网站http://www.castleproject.org
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: