web-dev-qa-db-fra.com

Mappeur non initialisé, lors de l'utilisation de ProjectTo ()

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.

18
Soheil Alizadeh

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;
}
30
Steve

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)
18
Sergey G.