Я довольно долго играл с ASP.NET Core MVC, и теперь я сталкиваюсь с неудачей. Я реализовал свой проект, используя CQRS, используя mediatR и automapper, но, похоже, не могу найти правильный способ проверки моделей страниц.
Мой дизайн основан на отделении сущностей от страниц. Команды / запросы возвращают модель страницы, которая обычно включает в себя DTO, который реализует профиль для встроенных карт для отображения из сущности в DTO.
Как можно использовать проверку и отображать сообщения об ошибках на странице, проверяя DTO, завернутый в модель страницы?
Теперь, для некоторого демонстрационного кода:
Демонстрационный запрос:
namespace HM.Application.Queries
{
public class GetAllMedicsQuery : IRequest<MedicIndexModel> { }
public class GetAllMedicsQueryHandler : IRequestHandler<GetAllMedicsQuery, MedicIndexModel>
{
private readonly IMedicRepository _medicRepository;
private readonly IMapper _mapper;
private readonly ILogger<GetAllMedicsQueryHandler> _logger;
public GetAllMedicsQueryHandler(IMedicRepository medicRepository, IMapper mapper, ILogger<GetAllMedicsQueryHandler> logger)
{
_medicRepository = medicRepository;
_mapper = mapper;
_logger = logger;
}
public async Task<MedicIndexModel> Handle(GetAllMedicsQuery request, CancellationToken cancellationToken)
{
var medics = await _medicRepository.GetAllMedics();
MedicIndexModel medicIndexModel = new MedicIndexModel()
{
Medics = _mapper.Map<IEnumerable<MedicIndexDTO>>(medics)
};
return medicIndexModel;
}
}
}
Модель страницы:
namespace HM.Application.ViewModels
{
public class MedicIndexModel : PageModel
{
public IEnumerable<MedicIndexDTO> Medics { get; set; }
}
}
И DTO:
namespace HM.DTO
{
public class MedicIndexDTO : IHaveCustomMapping
{
public string id { get; set; }
public string firstName { get; set; }
public string lastName { get; set; }
public string email { get; set; }
public string rank { get; set; }
public void CreateMappings(Profile configuration)
{
configuration.CreateMap<Medic, MedicIndexDTO>()
.ForMember(medicDto => medicDto.id, options => options.MapFrom(medic => medic.Id))
.ForMember(medicDto => medicDto.firstName, options => options.MapFrom(medic => medic.firstName))
.ForMember(medicDto => medicDto.lastName, options => options.MapFrom(medic => medic.lastName))
.ForMember(medicDto => medicDto.email, options => options.MapFrom(medic => medic.Email))
.ForMember(medicDto => medicDto.rank, options => options.MapFrom(medic => medic.rank));
}
}
}
Спасибо!