如何通过 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());
}
我有一个 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());
}