根據(jù)AutoMapper Documentation,我應(yīng)該能夠使用以下方法創(chuàng)建和使用自定義類型轉(zhuǎn)換器的實例:
var dest = Mapper.Map<Source, Destination>(new Source { Value = 15 },
opt => opt.ConstructServicesUsing(childContainer.GetInstance));
我有以下源和目標(biāo)類型:
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; }
}
以下類型的轉(zhuǎn)換器:
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;
}
}
這個簡單的測試應(yīng)斷言其中一個日期屬性被正確轉(zhuǎn)換:
[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);
}
}
但是在斷言發(fā)生之前我已經(jīng)得到了一個異常:
System.InvalidCastException:無法將類型為“SourceDestinationTypeConverter”的對象強(qiáng)制轉(zhuǎn)換為“Destination”.
我現(xiàn)在的問題是,如何使用ConstructServicesUsing()使用自定義類型轉(zhuǎn)換器? 解決方法: 我測試了這段代碼并使用以下代碼完成了這項工作:
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);
}
額外的轉(zhuǎn)換器:
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”參數(shù),因為轉(zhuǎn)換會失敗…將NULL值轉(zhuǎn)換為Type可能非常難……(而且我不知道這里發(fā)生了什么樣的轉(zhuǎn)換… .) 來源:http://www./content-1-214251.html
|