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

主要内容

1.基本类型配置

2.Array类型配置

3.List类型配置

4.Dictionary类型配置

5.自定义类型转换

一.基本类型配置

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

<component id="MyComponent">

    <parameters>

        <port>10</port>

    </parameters>

</component>

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

类型

节点

示例

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类型配置

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

// 出处:http://terrylee.cnblogs.com
public class MyComponent
{
    private int[] orders;

    public int[]Orders
    {

        get{ return this.orders;}
    }
    public MyComponent()
    {

    }
    public MyComponent(int[]orders)
    {
        this.orders = orders;
    }
}

这时候我们的配置文件可以如下去写

<!--出处: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类型配置

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

//出处:http://terrylee.cnblogs.com
public class MyComponent
{
    private IList _hosts;

    public MyComponent(IList hosts)
    {
        this._hosts = hosts;
    }

    public IList Hosts
    {
        get { return _hosts; }
    }
    //
}

这时候我们的配置文件应该如下

<!--出处: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类型配置

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

//出处:http://terrylee.cnblogs.com
public class MyComponent
{
    private IDictionary _dictionary;

    public MyComponent(IDictionary d)
    {
        this._dictionary = d;
    }

    public IDictionary Dictionary
    {
        get{ return this._dictionary;}
    }
    //
}

配置文件应该如下去写:

<!--出处: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>

五.自定义类型转换

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

protected virtual void InitDefaultConverters()
{
    Add( new PrimitiveConverter() );

    Add( new TypeNameConverter() );

    Add( new EnumConverter() );

    Add( new ListConverter() );

    Add( new DictionaryConverter() );

    Add( new ArrayConverter() ); 

}

这些类型转换器之间的结构图如下:

图1

PrimitiveConverter:负责基本数据类型的转换

TypeNameConverter:负责把一个类型的名字转换成这个类型的实例

EnumConverter:负责枚举类型的转换

ListConverter:负责Ilist数据类型的转换

DictionaryConverter:负责Idictionary数据类型转换

ArrayConverter:负责Array数据类型转换

以其中的PrimitiveConverter为例来看一下它的实现代码:

public class PrimitiveConverter : AbstractTypeConverter
{
    private Type[] types;

    public PrimitiveConverter()
    {
        types = new Type[]

            {
                typeof (Char),

                typeof (DateTime),

                typeof (Decimal),

                typeof (Boolean),

                typeof (Int16),

                typeof (Int32),

                typeof (Int64),

                typeof (UInt16),

                typeof (UInt32),

                typeof (UInt64),

                typeof (Byte),

                typeof (SByte),

                typeof (Single),

                typeof (Double),

                typeof (String)

            };
    }

    public override bool CanHandleType(Type type)
    {
        return Array.IndexOf(types, type) != -1;
    }

    public override object PerformConversion(String value, Type targetType)
    {
        if (targetType == typeof(String)) return value;

        try
        {
            return Convert.ChangeType(value, targetType);

        }
        catch(Exception ex)
        {
            String message = String.Format(

                "Could not convert from '{0}' to {1}", 

                value, targetType.FullName);

            throw new ConverterException(message, ex);

        }

    }

    public override object PerformConversion(IConfiguration configuration, Type targetType)

    {

        return PerformConversion(configuration.Value, targetType);

    }

}

可以看到,Castle IOC会把所有的配置参数都当作String类型接收,如果目标类型是String,则直接返回结果,否则再进行类型转换。由此我们可以分析得出,要实现自己的类型转换,有以下两步:

1.编写的自己的类型转换类,实现接口ITypeConverter

//出处:http://terrylee.cnblogs.com
public class MyTypeConverter : ITypeConverter
{
    //
}

2.添加自己的类型转换到ConversionManager中

IKernel kernel = new DefaultKernel();

IConversionManager conversionMng = (IConversionManager) 

    kernel.GetSubSystem( SubSystemConstants.ConversionManagerKey );

conversionMng.Add(new MyTypeConverter());

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

参考资料

Castle的官方网站http://www.castleproject.org

转载于:https://www.cnblogs.com/Terrylee/archive/2006/04/24/383196.html

Castle IOC容器构建配置详解(二)相关推荐

  1. java图片填充父容器_java相关:spring的父子容器及配置详解

    java相关:spring的父子容器及配置详解 发布于 2020-5-26| 复制链接 本篇文章主要介绍了spring的父子容器及配置详解,详细的介绍了spring父子容器的概念.使用场景和用法,有兴 ...

  2. 硬实时RTLinux安装配置详解 (二):编译运行RTLinux

    硬实时RTlinux系统配置 4. 配置RTLinux 4.1 配置Patch 4.2 配置RTLinux内核 4.3. 编译Rtlinux内核 4.4 制作initramfs启动引导: 5. 大功告 ...

  3. webpack 深入了解之loader配置详解(二)

    四,控制loader的执行顺序 用rules.enforce来控制,其有两个值: pre:优先执行 post:最后执行rules: [{test:/\.less$/,loader:'less-load ...

  4. Apache2 httpd.conf 配置详解 (二)

    DocumentRoot "/usr/local/apache-2.2.6/htdocs" #设置WEB文档根目录的默认属性 <Directory />     Opt ...

  5. 百度智能AI面相配置详解二

    上次分享了百度智能AI面相配置教程,有的朋友在配置中出现报错.今天整理了一下常见问题: 1.如果访问模块出现下面的报错信息,是因为没有安装 SG11 扩展 由于程序使用PHP-SG11加密, 按照提示 ...

  6. gitlab-ci配置详解(一)

    近期因为折腾gitlab-ci,专门去翻了很多文档,想想貌似自己挺傻的.按照官网教程本来biubiubiu就弄好了,非自己折腾了好几天,还没啥积累,真是作.想想唯一能积累的就是ci的配置详解了. 该文 ...

  7. 硬实时RTLinux安装配置详解 (一):准备工作

    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦: 硬实时RTlinux系统配置 1. Linux内核下载 2. 下载与Linu ...

  8. creo配置文件config选项详解_5年资深架构师重点聚焦:SpringBoot的配置详解+内嵌Servlet容器

    Spring Boot的配置详解 在本节中,我们将重点聚焦在Spring Boot的配置方面. 理解Spring Boot的自动配置 按照"约定大于配置"的原则,Spring Bo ...

  9. LCS2005客户端配置详解:LCS2005系列之二

    LCS2005客户端配置详解 上篇博文中我们介绍了如何部署LCS2005标准版,今天我们要再进一步,配置好LCS2005的客户端,使用户能够使用LCS提供的即时通讯服务来进行彼此间的信息交流.实验拓扑 ...

  10. Castle IOC容器与Spring.NET配置之比较

    我本人对于Spring.NET并不了解,本文只是通过一个简单的例子来比较一下两者配置之间的区别.在Castle IOC容器中,提出了自动装配(Auto-Wiring)的概念,即由容器自动管理组件之间的 ...

最新文章

  1. 百度编辑器修改,不让它自动替换html标签
  2. 非常全面的Android Bitmap知识点梳理
  3. 真不知写什么了,也就是很久没有做什么了
  4. C语言的三种基本程序结构是什么
  5. python与C#的互相调用
  6. [react] React必须使用JSX吗?
  7. 传感器工作原理_光电式速度传感器的工作原理
  8. hdu 1285 确定比赛名次
  9. 【数据结构笔记42】哈希表应用:文件中单词词频统计
  10. 以太坊虚拟机 EVM(1)EVMC interpreter
  11. 字体推荐——sarasa更纱黑体
  12. ODBC连接MySQL数据库、TLex配置ODBC
  13. 记录工作时,优化程序代码二
  14. 字节跳动实习面试:三面无修改公开,看看他到底通过了吗?
  15. Codeforces Problem-1591B Array Eversion
  16. PCB板不同材质区别
  17. 棋盘格相机标定图片拍摄方法
  18. mysql没开启binlog恢复数据_MySQL:binlog恢复数据
  19. Java入门基础知识点
  20. 【CodeForces 1255D --- Feeding Chicken】

热门文章

  1. MFC没改啥就断言错误
  2. ad17如何删除3d实体_3D打印的过程/流程
  3. 中内连和外联的去区别_外联请客丨第一百七十四期:鱼来了铁板烧请你吃铁板烤鱼和香辣牛蛙虾!...
  4. 多线程(三)--多线程间通信
  5. java并发编程实战读书笔记 ExecutorCompletionService
  6. Android 代码关于重构的一点体会
  7. GitHub 标星 8w!这个开源面试总结屌爆了!
  8. LeakCanary的原理,你知道么?
  9. android点击改变字体颜色,Android Textview 动态 部分文字点击 改变颜色
  10. java web实训项目_通知 | Java、web大前端将在南京开课啦!