如何通过 Unity XML 配置注入 "Type"

How to inject "Type" via Unity XML configuration

我有一个 class 结构,如下所示:

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>

我期待 unity 能够翻译“SomeOtherNameSpace.TextFile, SomeOtherBinary”,但它只不过是“FullyQualifiedClassName, AssemblyName”。但我收到以下错误:

TypeConverter 无法从 System.String.

转换

看来我漏掉了什么。

好的,这个 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());
    }