J'utilise Automapper 5.2.0 dans mon projet. Lorsque j'utilise ProjectTo()
dans le code, obtenez cette erreur:
Mappeur non initialisé. Appelez Initialize avec la configuration appropriée. Si vous essayez d'utiliser des instances de mappeur via un conteneur ou autre, assurez-vous que vous n'avez aucun appel aux méthodes Mapper.Map statiques et si vous utilisez les méthodes d'extension ProjectTo ou UseAsDataSource, assurez-vous de passer le IConfigurationProvider approprié exemple.
Code de service
public async Task<FreelancerProfileViewModel> GetFreelancerProfile()
{
var id = Guid.Parse(_identity.GetUserId());
var model = await _freelancerProfiles
.AsNoTracking()
.Where(_ => _.User.Id == id)
.ProjectTo<FreelancerProfileViewModel>()
.FirstAsync();
// var viewmodel = _mapper.Map<FreelancerProfileViewModel>(model);
return model;
}
Profil Automapper
public class FreelancerDashbordProfile : Profile
{
private readonly IIdentity _identity;
public FreelancerDashbordProfile(IIdentity identity)
{
_identity = identity;
var id = Guid.Parse(_identity.GetUserId());
CreateMap<FreelancerProfile, FreelancerProfileViewModel>()
.ForMember(_ => _.DoingProjectCount,
__ => __.MapFrom(_ => _.Projects.Count(project => project.ProjectState == ProjectState.Doing)))
.ForMember(_ => _.EndProjectCount,
__ => __.MapFrom(_ => _.Projects.Count(project => project.ProjectState == ProjectState.End)))
.ForMember(_ => _.ProjectCount, __ => __.MapFrom(_ => _.Projects.Count));
}
}
J'utilise aussi StructureMap Pour IoC
AutoMapperRegistery
public AutoMapperRegistery()
{
this.Scan(scan =>
{
scan.TheCallingAssembly();
scan.AssemblyContainingType<SkillProfile>(); // for other asms, if any.
scan.WithDefaultConventions();
scan.AddAllTypesOf<Profile>().NameBy(item => item.FullName);
});
this.For<MapperConfiguration>().Singleton().Use("MapperConfig", ctx =>
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMissingTypeMaps = true; // It will connect `Person` & `PersonViewModel` automatically.
addAllCustomAutoMapperProfiles(ctx, cfg);
});
config.AssertConfigurationIsValid();
return config;
});
this.For<IMapper>()
.Singleton()
.Use(ctx => ctx.GetInstance<MapperConfiguration>().CreateMapper(ctx.GetInstance));
}
Je vois Autre Question et Issue mais pas résolu mon problème.
Vous devez passer le fournisseur MappingConfiguration à l'appel ProjectTo.
public async Task<FreelancerProfileViewModel> GetFreelancerProfile()
{
var id = Guid.Parse(_identity.GetUserId());
var model = await _freelancerProfiles
.AsNoTracking()
.Where(_ => _.User.Id == id)
.ProjectTo<FreelancerProfileViewModel>(_mapper.Configuration)
.FirstAsync();
// var viewmodel = _mapper.Map<FreelancerProfileViewModel>(model);
return model;
}
Dans la version .NET Core 2.1 (AutoMapper 7.0.1), vous devez passer le ConfigurationProvider
.
1) Enregistrez AutoMapper comme décrit ici
2) Injectez au contrôleur:
private readonly IMapper _mapper;
public SomeController(ApplicationDbContext dbContext, IMapper mapper)
{ _mapper = mapper; }
3) Passez le ConfigurationProvider
de cette façon:
ApplicationDbContext.SomeEntities.ProjectTo<SomeModel>(_mapper.ConfigurationProvider)