编辑:包含TypeConverter
要设置阶段,我将从现有WCF服务中剥离代码以放入业务对象(BO),WCF将引用该业务对象以向客户端提供信息。要求是使Employee对象的employeeId为整数而不是当前使用的字符串。我使用AutoMapper映射BO和WCF之间的所有对象,以便合同不会中断。但是,我正在努力解决如何为EmployeeId来回提供映射,使其成为BO中的整数,并且仍然通过WCF合同提供字符串。
BO
public class Employee
{
public int Id {get; set;}
......
}
WCF
[DataContract(Name = "Employee", Namespace="url")]
public class Employee
{
[DataMember(Order = 1)]
public string Id {get; set;}
......
}
映射
Mapper.CreateMap<Employee.Entity.Employee, Employee.Service.Entity.Employee>()
PaddedStringTypeConverter类:
public class PaddedStringTypeConverter : ITypeConverter<int, string>
{
public string Convert(ResolutionContext context)
{
var sourceValue = System.Convert.ToInt32(context.SourceValue);
return sourceValue.ToString("D9");
}
}
我已经看到我可以在AutoMapper中使用自定义类型转换器将BO从一个整数更改为我们固定长度的九个字符,这样整数值4610就相当于一个&#34; 000004610&#34 ;.但是,如何将其恢复为整数值。
你会怎么做?
答案 0 :(得分:2)
Automapper非常适合自动映射到具有相同名称的事物。如果要更改转换,或者要映射到的事物的名称不同,则需要使用.ForMember()。你的地图是这样的:
Mapper.CreateMap<Employee.Entity.Employee, Employee.Service.Entity.Employee>()
.ForMember(dest => dest.EmployeeID, expression => expression.MapFrom(src => Convert.ToInt32(src.EmployeeID)))
;
然后添加反向自定义映射。
你不应该需要PaddedStringTypeConverter类。
答案 1 :(得分:2)
为两个方向创建两个映射:
Mapper.CreateMap<Employee.Entity.Employee, Employee.Service.Entity.Employee>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id.ToString("D9")))
.ReverseMap()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => int.Parse(src)));
这会在两个方向创建地图,并且选项会来回转换该成员的类型。
ReverseMap是CreateMap的快捷方式,其中切换了源/目标类型。