Проблема картографирования. Отображение списка объектов в список строк

Я пытаюсь сопоставить модель сервиса с моделью представления, используя Mapster.

Моя сервисная модель содержит список строк.

Моя модель просмотра содержит список типов RolesViewModel.

RolesViewModel имеет строковое свойство с именем RoleName.

Ниже мои модели

public class UserViewModel
{
    [Display(Name = "Email address")]
    [Required(ErrorMessage = "The email address is required")]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    public string Email { get; set; }

    public List<RolesViewModel> Roles { get; set; } = new List<RolesViewModel>();
}

public class RolesViewModel
{
    public RolesViewModel(string roleName)
    {
        RoleName = roleName;
    }

    public string RoleName { get; set; }
}

//Service Model
public class User
{
    public string Email { get; set; }
    public List<string> Roles { get; set; } = new List<string>();
}

//Service Return Model
public class ServiceResponse<T>
{
    public bool Success { get; set; } = false;
    public Data.Enums.Exception Exception { get; set; }
    public T ResponseModel { get; set; }

    /// <summary>
    /// Allows Service Response <T> to be cast  to a boolean. 
    /// </summary>
    /// <param name="response"></param>
    public static implicit operator bool(ServiceResponse<T> response)
    {
        return response.Success;
    }
}

Строка в моем контроллере, где я применяю отображение, выглядит следующим образом:

List<UserViewModel> viewModel = serviceResponse.ResponseModel.Adapt<List<UserViewModel>>();

И наконец мой картографический конфиг

public class Mapping : IRegister
{
    public void Register(TypeAdapterConfig config)
    {
        config.NewConfig<Tracer, TracerViewModel>();
        config.NewConfig<Asset, AssetViewModel>();
        config.NewConfig<Project, ProjectViewModel>();
        config.NewConfig<User, UserViewModel>();
        config.NewConfig<RolesViewModel, string>();
    }
}

Чтобы попытаться заставить отображение работать, я попытался обновить конфигурацию отображения:

public class Mapping : IRegister
{
    public void Register(TypeAdapterConfig config)
    {
        config.NewConfig<Tracer, TracerViewModel>();
        config.NewConfig<Asset, AssetViewModel>();
        config.NewConfig<Project, ProjectViewModel>();
        config.NewConfig<User, UserViewModel>().Map(dest => dest.Roles.Select(t => t.RoleName.ToString()).ToList(), src => src.Roles);
        config.NewConfig<UserViewModel, User>().Map(src => src.Roles, dest => dest.Roles.Select(t => t.RoleName.ToString()).ToList());
        config.NewConfig<RolesViewModel, string>();
    }
}

Но я получаю сообщение об ошибке: "Неверное приведение из" System.String "к" ViewModels.RolesViewModel ".

Может кто-нибудь, пожалуйста, посоветуйте мне, какой конфиг мне нужен в моем классе отображения.

1 ответ

Кажется, вы пытаетесь наложить прямую карту между строкой и объектом в последней строке вашей функции Register. Концепция картстера и других картографов объекта-объекта заключается в том, что они отображают объекты на другие объекты. Вы не можете сопоставить объект с типом ссылки CLR. Чтобы добиться того, что вы пытаетесь сделать, лучше всего создать функцию, которая получает строку и обрабатывает ее должным образом.

Как говорит Mapster, при сопоставлении строк он будет использовать ToString или Parse для выполнения сопоставления:

var s = 123.Adapt<string>(); //equal to 123.ToString(); 
var i = "123".Adapt<int>();  //equal to int.Parse("123");

поэтому вам нужно будет реализовать подпрограмму преобразования, которая сообщает mapster, как выполнять синтаксический анализ из String в RolesViewModel.

Другие вопросы по тегам