如何注射#34; Type"通过Unity XML配置

时间:2016-03-17 15:10:16

标签: c# dependency-injection unity-container

我的课程结构如下:

public class Processor : IRegister
{
  public Processor(IRequiredDependency dependency)
  {
  }

  public Type[] ObjectTypes { get; set; }
}

public class TextFile
{}

public class ImageFile
{}

我们为我们的应用程序使用设计时统一配置(基于XML)。我想为ObjectTypes注入价值。我的XML配置如下:

      <type type="SomeNamespace.IRegister, SomeBinary"
            mapTo="SomeNamespace.Processor, SomeOtherBinary"
            name="MyProcessor">
        <property name="ObjectTypes">
          <array>
            <value value="SomeOtherNameSpace.TextFile, SomeOtherBinary"/>
            <value value="SomeOtherNameSpace.ImageFile, SomeOtherBinary"/>
          </array>
        </property>
      </type>

我期待团结能够翻译&#34; SomeOtherNameSpace.TextFile, SomeOtherBinary&#34;这只是&#34; FullyQualifiedClassName, AssemblyName&#34;。但是我收到了以下错误:

TypeConverter无法转换为System.String

看起来我错过了什么。

1 个答案:

答案 0 :(得分:0)

好的,这个documentation对我有所帮助。我错过了<value>中的typeConverter属性。默认类型转换器无法从string转换为Type。我不得不写TypeConverter来支持这个。

更新的XML配置现在看起来像:

 <unity>
    <alias alias="MyTypeConverter" type="Namespace.MyTypeConverter, MyBinary" />
    <containers>
      <container>
type type="SomeNamespace.IRegister, SomeBinary"
            mapTo="SomeNamespace.Processor, SomeOtherBinary"
            name="MyProcessor">
        <property name="ObjectTypes">
          <array>
            <value value="SomeOtherNameSpace.TextFile, SomeOtherBinary" typeConveter="MyTypeConverter"/>
            <value value="SomeOtherNameSpace.ImageFile, SomeOtherBinary" typeConveter="MyTypeConverter"/>
          </array>
        </property>
      </type>

注意:我必须添加TypeConverter实现,它简单如下:

public class MyTypeConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        return Type.GetType(value.ToString());
    }