首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Castle Windsor 容器配置進階(二):陣列、列表、字典與自定義類型轉換器實作

     編輯:關於.NET

基本型別自動轉換

MicroKernel 內建 TypeConverter 自動處理基本型別,配置時無需指定型別:

<component id="MyComponent">
  <parameters>
    <port>10</port>          <!-- int -->
    <server>mail.host.com</server> <!-- string -->
    <threshold>13.22</threshold>  <!-- double -->
    <enabled>true</enabled>     <!-- bool -->
    <initial>2024-01-01</initial> <!-- DateTime -->
    <type>MyApp.Comp, MyApp</type> <!-- Type -->
  </parameters>
</component>

複雜型別配置

陣列

<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>

IList

<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>

IDictionary

<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>

或指定 Key/Value 型別:

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

自定義類型轉換器

內建轉換器體系

TypeConverter 階層

  • PrimitiveConverter:基本型別
  • TypeNameConverter:型別名稱 → Type
  • EnumConverter:列舉
  • ListConverter:IList
  • DictionaryConverter:IDictionary
  • ArrayConverter:Array

PrimitiveConverter 參考實作

public class PrimitiveConverter : AbstractTypeConverter
{
    private readonly Type[] _types = { typeof(char), typeof(DateTime), typeof(decimal), typeof(bool),
        typeof(short), typeof(int), typeof(long), typeof(ushort), typeof(uint), typeof(ulong),
        typeof(byte), typeof(sbyte), typeof(float), typeof(double), typeof(string) };

    public override bool CanHandleType(Type type) => 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)
        {
            throw new ConverterException($"Could not convert from '{value}' to {targetType.FullName}", ex);
        }
    }

    public override object PerformConversion(IConfiguration config, Type targetType)
        => PerformConversion(config.Value, targetType);
}

兩步驟實作自定義轉換器

  1. 實作 ITypeConverter:public class MyTypeConverter : ITypeConverter { ... }
  2. 註冊至 ConversionManager:
    IKernel kernel = new DefaultKernel();
    var conversionMgr = (IConversionManager)kernel.GetSubSystem(SubSystemConstants.ConversionManagerKey);
    conversionMgr.Add(new MyTypeConverter());
    
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved