【问题标题】:How to inject "Type" via Unity XML configuration如何通过 Unity XML 配置注入“类型”
【发布时间】:2016-03-17 15:10:16
【问题描述】:

我的类结构如下:

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 转换。

看来我错过了什么。

【问题讨论】:

    标签: c# dependency-injection unity-container


    【解决方案1】:

    好的,这个documentation 帮助了我一点。我在&lt;value&gt; 中缺少 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());
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多