主要内容

  1.基本类型配置

  2.Array类型配置

  3.List类型配置

  4.Dictionary类型配置

  5.自定义类型转换

  一.基本类型配置

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

双击代码全选
1
2
3
4
5
<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的参数

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MyComponent
{
  private int[] orders;
  public int[]Orders
  {
    get{ return this.orders;}
  }
  public MyComponent()
  {
  }
  public MyComponent(int[]orders)
  {
    this.orders = orders;
  }
}

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

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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类型的参数

双击代码全选
1
2
3
4
5
6
7
8
9
public class MyComponent
{
  private IList _hosts;
  public MyComponent(IList hosts)
  {
    this._hosts = hosts;
  }
  public IList Hosts
  {

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

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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类型的参数

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyComponent
{
  private IDictionary _dictionary;
  public MyComponent(IDictionary d)
  {
    this._dictionary = d;
  }
  public IDictionary Dictionary
  {
    get{ return this._dictionary;}
  }
  //
}

配置文件应该如下去写:

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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。

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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初始化的时候,会加载以下几个类型转换:

双击代码全选
1
2
3
4
5
6
7
8
9
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为例来看一下它的实现代码:

双击代码全选
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
39
40
41
42
43
44
45
46
47
48
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

双击代码全选
1
2
3
4
public class MyTypeConverter : ITypeConverter
{
  //
}

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

双击代码全选
1
2
3
4
IKernel kernel = new DefaultKernel();
IConversionManager conversionMng = (IConversionManager)
  kernel.GetSubSystem( SubSystemConstants.ConversionManagerKey );
conversionMng.Add(new MyTypeConverter());

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

Castle IOC容器构建配置详解(二)的更多相关文章

  1. Castle IOC容器构建配置详解(一)

    主要内容 1.配置什么 2.几种配置方式 3.Include 介绍 4.Properties介绍 5.条件状态 一.配置什么 Castle IOC中并不像Spring.net那样贯穿着一个思想就是一切 ...

  2. logback -- 配置详解 -- 二 -- <appender>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  3. Spring源码解析二:IOC容器初始化过程详解

    IOC容器初始化分为三个步骤,分别是: 1.Resource定位,即BeanDefinition的资源定位. 2.BeanDefinition的载入 3.向IOC容器注册BeanDefinition ...

  4. Spring框架 之IOC容器 和AOP详解

    主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置  一.S ...

  5. logback配置详解(二)

    <appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的组件. <appende ...

  6. (转)Apache2 httpd.conf 配置详解 (二)

    转之--http://jafy00.blog.51cto.com/2594646/508205 DocumentRoot "/usr/local/apache-2.2.6/htdocs&qu ...

  7. logback -- 配置详解 -- 四 -- <filter>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  8. logback -- 配置详解 -- 三 -- <encoder>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

  9. logback -- 配置详解 -- 一 -- <configuration>及子节点

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

随机推荐

  1. java-过滤器-监听器-拦截器

    1.过滤器 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml ...

  2. Spring中@Resource与@Autoware

    问题 这其实就是@Autoware与@Resource没有正确的使用,这个错误是因为wmPoiOplogService这个变量装配方式是@Resource,按照@Resource的按名字查找的方式,并 ...

  3. Oracle 11g RAC oc4j/gsd Offline

    Oracle 11g RAC中,发现oc4j以及gsd服务都处于offline状态,这是Oracle 11g RAC默认情形.即便如此,并不影响数据库的使用,因为 oc4j 是用于WLM 的一个资源, ...

  4. xtraTabControl 如何遍历每个选项卡 z

    XtraTabHitInfo hi = tabPositionControl.CalcHitInfo(new Point(e.X, e.Y)); if (hi.HitTest == XtraTabHi ...

  5. android技巧:EditText输入错误时该怎样提示用户

    验证用户输入内容(EditText)应该及时准确的告诉用户,那么在Android系统中提示用户通常有以下做法: 1) 使用Toast提示 1 Toast.makeText(this, "邮箱 ...

  6. SORT UNIQUE|AGGREGATE|GROUP BY|ORDER BY|JOIN

    相信做oracle开发和管理的朋友对sort肯定不会陌生,大家通常都遇到这样那样的排序性能问题,所以我写这一系列关于sort的文章告诉大家在oracle里面sort是怎么一回事以及如果调整sort获得 ...

  7. bzoj1013

    这道题题解太多,只贴代码. #include<cstdio> #include<cmath> #include<algorithm> using namespace ...

  8. C#判断程序是由Windows服务启动还是用户启动

    在Windows系统做网络开发,很多时候都是使用Windows服务的模式,但在调度阶段,我们更多的是使用控制台的模式.在开发程序的时候,我们在Program的Main入口进行判断.最初开始使用Envi ...

  9. CSS抗锯齿 font-smoothing

    CSS3里面加入了一个“-webkit-font-smoothing”属性. 这个属性可以使页面上的字体抗锯齿,使用后字体看起来会更清晰舒服. 加上之后就顿时感觉页面小清晰了. 淘宝也在用哦! 它有三 ...

  10. [转]Javascript定义类的三种方法

    作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html 将近2 ...