AutoMapper自定义类型转换使用ConstructServicesUsing
本文关键字:ConstructServicesUsing 类型转换 自定义 AutoMapper | 更新日期: 2023-09-27 18:19:20
根据AutoMapper文档,我应该能够使用以下方式创建和使用自定义类型转换器的实例:
var dest = Mapper.Map<Source, Destination>(new Source { Value = 15 },
opt => opt.ConstructServicesUsing(childContainer.GetInstance));
我有以下源和目标类型:
public class Source {
public string Value1 { get; set; }
public string Value2 { get; set; }
public string Value3 { get; set; }
}
public class Destination {
public int Value1 { get; set; }
public DateTime Value2 { get; set; }
public Type Value3 { get; set; }
}
和以下类型转换器:
public class DateTimeTypeConverter : ITypeConverter<string, DateTime> {
public DateTime Convert(ResolutionContext context) {
return System.Convert.ToDateTime(context.SourceValue);
}
}
public class SourceDestinationTypeConverter : ITypeConverter<Source, Destination> {
public Destination Convert(ResolutionContext context) {
var dest = new Destination();
// do some conversion
return dest;
}
}
这个简单的测试应该断言其中一个日期属性被正确转换:
[TestFixture]
public class CustomTypeConverterTest {
[Test]
public void ShouldMap() {
Mapper.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());
Mapper.CreateMap<Source, Destination>().ConstructUsingServiceLocator();
var destination =
Mapper.Map<Source, Destination>(
new Source { Value1 = "15", Value2 = "01/01/2000", },
options => options.ConstructServicesUsing(
type => new SourceDestinationTypeConverter())
); // exception is thrown here
Assert.AreEqual(destination.Value2.Year, 2000);
}
}
但是在断言发生之前我已经得到了一个异常:
System.InvalidCastException : Unable to cast object of type 'SourceDestinationTypeConverter ' to type 'Destination'
.
我现在的问题是,我如何使用自定义类型转换器使用ConstructServicesUsing()
?
我测试了这段代码,并使用以下代码使其工作:
public void TestMethod1()
{
Mapper.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());
Mapper.CreateMap<string, Type>().ConvertUsing(new StringTypeConverter());
Mapper.CreateMap<string, int>().ConvertUsing(new StringIntConverter());
Mapper.CreateMap<Source, Destination>();
var destination =
Mapper.Map<Source, Destination>(
new Source { Value1 = "15", Value2 = "01/01/2000", Value3 = "System.String" },
options => options.ConstructServicesUsing(type => new SourceDestinationTypeConverter())
);
Assert.AreEqual(destination.Value2.Year, 2000);
}
和额外的转换器:
public class StringTypeConverter : ITypeConverter<string, Type>
{
public Type Convert(ResolutionContext context)
{
return Type.GetType(context.SourceValue.ToString());
}
}
public class StringIntConverter : ITypeConverter<string, int>
{
public int Convert(ResolutionContext context)
{
return Int32.Parse(context.SourceValue.ToString());
}
}
Automapper缺少String到Type和String到Int的映射。此外,我必须删除以下行
Mapper.CreateMap<Source, Destination>().ConstructUsingServiceLocator();
用
代替Mapper.CreateMap<Source, Destination>();
我不知道"ConstructUsingServiceLocator()"选项,但在这种情况下,将其排除在外…(我不知道把它去掉是否会给你带来其他问题。直到现在,我还没有在使用Automapper时使用过这个选项。)
请注意,我必须添加"Value3"参数,因为转换将失败…将NULL值转换为Type可能相当困难……(我不知道这里发生了什么样的转换…)
我遇到了以下错误
InvalidCastException:无法转换类型为"xxxTypeConverter"的对象输入"AutoMapper.ITypeConverter"2[System.String,System.DateTime]"当执行CustomTypeConverter的Automapper示例时。
我通过替换
修复了这个问题public class DateTimeTypeConverter : ITypeConverter<string, DateTime>
public class DateTimeTypeConverter : AutoMapper.ITypeConverter<string, DateTime>
同样和
public class TypeTypeConverter : ITypeConverter<string, Type>
public class TypeTypeConverter : AutoMapper.ITypeConverter<string, Type>