У нас есть неизменяемые объекты, использующие шаблон построителя. Для их сопоставления требуется немного больше стандартного кода, но это возможно.
// ViewModel
public class CarModel : IVehicleModel
{
private CarModel (Builder builder)
{
LicensePlate = builder.LicensePlate;
}
public string LicensePlate { get; }
//
public Builder
{
public string LicensePlate { get; set; }
}
}
// Model
public class CarViewModel : IVehicleViewModel
{
private CarViewModel (Builder builder)
{
LicensePlate = builder.LicensePlate ;
}
public ILicensePlate LicensePlate { get; }
//
public Builder
{
public ILicensePlate LicensePlate { get; set; }
}
}
У нашего AutoMapper Profiles
есть три зарегистрированных сопоставления:
CreateMap<IVehicleModel, CarViewModel.Builder>();
CreateMap<CarViewModel.Builder, IVehicleViewModel>().ConvertUsing(x => x.Build());
CreateMap<IVehicleModel, IVehicleViewModel>().ConvertUsing<VehicleModelTypeConverter>();
Затем VehicleModelTypeConverter
определяет двухэтапное преобразование:
public IVehicleViewModel Convert(IVehicleModel source, IVehicleViewModel destination,
ResolutionContext context)
{
var builder = context.Mapper.Map<CarViewModel.Builder>(source);
var model = context.Mapper.Map<IVehicleViewModel>(builder);
return model;
}
(Реализация ITypeListConverter<string, ILicensePlate>
выполняет это сопоставление).
Использование в нашей системе как обычно:
var result = _mapper<IVehicleViewModel>(_carModel);
Это использует AutoMapper v7.0.1
person
Paddy
schedule
21.02.2020