Automapper + MVC.Unit5 + Профиль Инъекции - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть проект AspNet WebApi 2, и мне нужно сопоставить класс запроса с классом сущности.

Итак, у меня есть эти коды:

Класс запроса:

Класс, представляющий запрос только с идентификаторами подклассов и другими типами данных.

public class TicketRequest
{
    public int IdTicket { get; set; }

    //I want to use those ids to get the full entity from repo !!!
    public int IdStatusTicket { get; set; }
    public int IdUsuarioCliente { get; set; }
    public int idCategoria { get; set; }
    public int idClassificacao { get; set; }

    public string Titulo { get; set; }
    public string Descricao { get; set; }
    public DateTime? DataHoraInicial { get; set; }
    public DateTime? DataHoraAlteracao { get; set; }
    public DateTime? DataHoraUltimaMensagem { get; set; }
    public DateTime? DataHoraFinal { get; set; }
}

Класс сущности:

Класс, представляющий мой основной класс сущности со всеми подклассами.

public class Ticket
{
    public Ticket()
    {
        StatusTicket = new StatusTicket();
        UsuarioCliente = new UsuarioCliente();
        Categoria = new Categoria();
        Classificacao = new Classificacao();
    }

    public int IdTicket { get; set; }

    //Here are the subclasses which I want to load from repo !!!
    public StatusTicket StatusTicket { get; set; }
    public UsuarioCliente UsuarioCliente { get; set; }
    public Categoria Categoria { get; set; }
    public Classificacao Classificacao { get; set; }

    public string Titulo { get; set; }
    public string Descricao { get; set; }
    public DateTime? DataHoraInicial { get; set; }
    public DateTime? DataHoraAlteracao{ get; set; }
    public DateTime? DataHoraUltimaMensagem { get; set; }
    public DateTime? DataHoraFinal { get; set; }            
}

Как я уже говорил, я хочу сопоставить первый класс с последним.

Итак, я ожидаю автоматической загрузки всех подклассов внутри сущности Ticket, например, Категории,

* 1018.* После некоторого времени поиска я нашел идею создания профиля и resolver для всех свойств (подклассов) внутри моего основного объекта Ticket.

Для теста, Я просто реализую один подкласс, чтобы увидеть, работает ли он, и ниже есть реализация, которая получает сущность категории из репозитория и загружает свойство категории, внутри сущности Ticket.

Resolver:

ЗдесьУ меня есть класс резолвера,вызов метода бизнес-уровня (внедренный).Я использую MVC.Unit5 для управления моим DI.

public class CategoriaResolver : IValueResolver<TicketRequest, Ticket, Categoria>
{
    private ICategoriaBusiness _business;


    public CategoriaResolver(ICategoriaBusiness business)
    {
        _business = business;
    }

    Categoria IValueResolver<TicketRequest, Ticket, Categoria>.Resolve(TicketRequest source, Ticket destination, Categoria destMember, ResolutionContext context)
    {
        return _business.Get(source.idCategoria);
    }
}

Профиль:

Здесь у меня есть класс профиля, чтобы сделать преобразование из TicketRequest в Ticket, вызывая класс распознавателя.

public class TicketRequestToDomainMappingProfile : Profile
{
    public TicketRequestToDomainMappingProfile()
    {
        CreateMap<TicketRequest, Ticket>()
        .ForMember(d => d.Categoria, opt => opt.MapFrom<CategoriaResolver>());
    }
}

И, наконец, здесь я регистрирую класс профиля в Automapper:

public static class AutoMapperConfig
{
    public static void RegisterMappings()
    {
        Mapper.Initialize(map =>
        {
            map.AddProfile<DomainToDTOMappingProfile>();
            map.AddProfile<DTOToDomainMappingProfile>();
            map.AddProfile<TicketRequestToDomainMappingProfile>();
        });
    }
}

Контроллер:

В моем контроллере у меня есть это:

[HttpPost]
public IHttpActionResult Insert([FromBody]TicketRequest request)
{
    try
    {
        ...               
        var entity = Mapper.Map<TicketRequest, Ticket>(request); (*)
        int identity = _business.Insert(entity);
        ...

В строке (*) я вызываю сопоставление, но оно не работает, и я получаю эту ошибку:

Типы сопоставления ошибок.

Типы сопоставления:TicketRequest -> Ticket Atendimento.Entities.Request.TicketRequest -> Atendimento.Entities.Entities.Ticket

Тип Конфигурация карты: TicketRequest -> Ticket Atendimento.Entities.Request.TicketRequest -> Aоприятия.Предложения

Назначение Участник: Категория

Я сомневаюсь, чего мне не хватает?Я делаю правильное отображение?

Идея была получена из этих URL https://social.technet.microsoft.com/wiki/contents/articles/51043.automapper-handling-profile-dependencies-using-custom-value-resolvers.aspx и http://docs.automapper.org/en/stable/8.0-Upgrade-Guide.html

С уважением.

...