У меня запущено простое приложение CQRS, и все работает, как и ожидалось, отображение работает и т. Д. Я думаю, причина, по которой он не работает, заключается в том, что созданный мной автоматический обработчик не применяется к ProjectTo
, поскольку ProjectTo
использует методы расширения
Я даже попытался передать маппер из теста в обработчик запросов и изменить его на .ProjectTo<T>(mapper.Configuration)
Сбой со следующим
Сообщение: System.InvalidOperationException: Mapper не инициализирован. Вызовите Initialize с соответствующей конфигурацией. Если вы пытаетесь использовать экземпляры mapper через контейнер или иным образом, убедитесь, что у вас нет вызовов статических методов Mapper.Map, и если вы используете методы расширения ProjectTo или UseAsDataSource, убедитесь, что вы передаете соответствующий IConfigurationProvider. экземпляр.
public class GetAnnouncementsQueryHandler : IRequestHandler<GetAnnouncementsQuery, IEnumerable<AnnouncementModel>>
{
private readonly EventsContext context;
public GetAnnouncementsQueryHandler(EventsContext context)
{
this.context = context;
}
public async Task<IEnumerable<AnnouncementModel>> Handle(GetAnnouncementsQuery request,
CancellationToken cancellationToken)
{
return await context.Announcements
.Where(a => a.OwnerId == request.OwnerId && !a.IsDeleted)
.ProjectTo<AnnouncementModel>()
.ToListAsync(cancellationToken);
}
}
Настройка для автомаппера осуществляется через Autofac для реального кода, а для тестирования я просто скопировал профиль и вызвал его в ctor тестового класса
private void SetupMapper()
{
var config = new MapperConfiguration(opts =>
{
opts.CreateMap<Announcement, AnnouncementModel>();
});
mapper = config.CreateMapper(); // Use this mapper to instantiate your class
}
К вашему сведению, для реального кода мне не нужно было указывать отображение, поскольку ProjectTo
, похоже, оно не нужно. Единственный способ заставить его работать из теста - это перестать использовать ProjectTo
и положиться на ручное отображение