我有一个简单的CQRS应用程序正在运行,并且一切都按预期工作,映射工作正常。我猜想它无法正常工作的原因是因为自{{1}起,我正在创建的自动映射器未应用于ProjectTo
}正在使用扩展方法
我什至尝试将映射器从测试传递到查询处理程序,并将其更改为ProjectTo
失败,并显示以下内容
消息:System.InvalidOperationException:映射器未初始化。用适当的配置调用初始化。如果您尝试通过容器或其他方式使用mapper实例,请确保没有对静态Mapper.Map方法的任何调用,并且如果您使用的是ProjectTo或UseAsDataSource扩展方法,请确保传递适当的IConfigurationProvider实例。
.ProjectTo<T>(mapper.Configuration)
针对Automapper的设置是通过Autofac完成的,用于真实代码,对于测试,我只是复制了配置文件,并在测试类的ctor中调用了它
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);
}
}
仅供参考,对于真实的代码,我不需要指定映射,因为 private void SetupMapper()
{
var config = new MapperConfiguration(opts =>
{
opts.CreateMap<Announcement, AnnouncementModel>();
});
mapper = config.CreateMapper(); // Use this mapper to instantiate your class
}
似乎不需要它。我可以使其从测试中正常工作的唯一方法是我是否停止使用ProjectTo
并依靠手动映射