web-dev-qa-db-ja.com

マッパーが初期化されていません。ProjectTo()を使用する場合

私のプロジェクトではAutomapper 5.2.0を使用しています。コードでProjectTo()を使用すると、このエラーが発生します。

マッパーが初期化されていません。適切な構成でInitializeを呼び出します。コンテナーなどを介してマッパーインスタンスを使用する場合は、静的なMapper.Mapメソッドへの呼び出しがないことを確認し、ProjectToまたはUseAsDataSource拡張メソッドを使用している場合は、適切なIConfigurationProviderを渡してください。インスタンス。

サービスコード

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

オートマッパープロファイル

   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));

    }

}

また、私は StructureMap を使用 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));


    }

その他 質問 および 問題 が表示されますが、問題は解決していません。

18
Soheil Alizadeh

MappingConfigurationプロバイダーを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

.NET Core 2.1(AutoMapper 7.0.1)バージョンでは、ConfigurationProviderを渡す必要があります。

1)説明したようにAutoMapperを登録します ここ

2)コントローラーに注入します。

private readonly IMapper  _mapper;
public SomeController(ApplicationDbContext dbContext, IMapper mapper)
{ _mapper = mapper; }

3)ConfigurationProviderを次のように渡します:

 ApplicationDbContext.SomeEntities.ProjectTo<SomeModel>(_mapper.ConfigurationProvider)
18
Sergey G.