AutoMapper:Int to String再返回

时间:2014-07-28 17:50:27

标签: c# wcf automapper

编辑:包含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 ;.但是,如何将其恢复为整数值。

你会怎么做?

2 个答案:

答案 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的快捷方式,其中切换了源/目标类型。