Automapper 在 Profile 类中注入 DbContext

Dim*_*nev 4 c# automapper asp.net-core

我有以下映射配置文件

public class DomainProfile : Profile
{
    private FootballPredictionsContext m_Context;

    public DomainProfile(FootballPredictionsContext context)
    {
        m_Context = context;
    }

    public DomainProfile()
    {
        CreateMap<TipModel, Tip>()
            .ForMember(tip => tip.BetType, m => m.MapFrom(x => m_Context.BetTypes.First(y => y.Name == x.BetType)))
            .ForMember(tip => tip.BetCategory, m => m.MapFrom(x => m_Context.BetCategories.First(y => y.Name == x.BetCategory)))
            .ForMember(tip => tip.Sport, m => m.MapFrom(x => m_Context.Sports.First(y => y.Name == x.Sport)))
            .ForMember(tip => tip.Tipster, m => m.MapFrom(model => m_Context.Tipsters.First(y => y.Username == model.Tipster)));
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,一些映射正在使用DbContext,所以我必须以某种方式将它注入DomainProfile

在 Startup 类中,我正常初始化 Automapper

public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped(typeof(IUnificator), typeof(Unificator));
            services.AddDbContext<FootballPredictionsContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Database")));
            services.AddDbContext<UnificationContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Database")));

            services.AddSingleton(provider => new MapperConfiguration(cfg =>
                {
                    cfg.AddProfile(new UserProfile(provider.GetService<IUserManager>()));
                }).CreateMapper());
            services.AddMvc();
        }
Run Code Online (Sandbox Code Playgroud)

我试过这个解决方案,但我收到'Cannot resolve scoped service 'FootballPredictions.DAL.FootballPredictionsContext' from root provider.'

Sim*_*Ged 7

我最近遇到了一个类似的问题,这归结于我试图将服务注入到具有更长生命周期(例如瞬态和范围)的服务中。什么生命周期与 DomainProfile 类相关?您是否尝试将其更改为 Scoped 或 Transient 以查看是否有帮助?

正如@DimitarTsonev 所实现的那样:因此,将映射器范围更改为

services.AddScoped(provider => new MapperConfiguration(cfg =>
    {
        cfg.AddProfile(new DomainProfile(provider.GetService<FootballPredictionsContext>()));
    }).CreateMapper());
Run Code Online (Sandbox Code Playgroud)

修复了问题