首页 > 解决方案 > 我在 >NET Web API 中实现 MediatR 时遇到问题。我不知道发生了什么

问题描述

我正在关注 .NET Web API 中有关 MediatR 的教程,并遇到此错误:

System.AggregateException: 'Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: MediatR.IRequestHandler`2[Application.Activities.List+Query,System.Collections.Generic.List`1[Domain.Activity]] Lifetime: Transient ImplementationType: Application.Activities.List+Handler': Unable to resolve service for type 'Domain.DataContext' while attempting to activate 'Application.Activities.List+Handler'.)' 

我不知道它是什么。这是我的代码:

活动课:

public class Activity
{
    public Guid Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Category { get; set; }
    public DateTime Date { get; set; }
    public string City { get; set; }
    public string Venue { get; set; }
}

数据上下文.cs

public class DataContext : DbContext
{
    public DbSet<Value> Values { get; set; }
    public DbSet<Activity> Activities { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("server=localhost;database=Reactivities;uid=admin2;pwd=minhquan");
    }
}

列表.cs

public class List
{
    public class Query: IRequest<List<Activity>> { }
    public class Handler : IRequestHandler<Query, List<Activity>>
    {
        private readonly DataContext context;

        public Handler(DataContext context)
        {
            this.context = context;
        }

        public async Task<List<Activity>> Handle(Query request, CancellationToken cancellationToken)
        {
            var activities = await context.Activities.ToListAsync();
            return activities;
        }
    }
}

程序.cs

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        using(var scope = host.Services.CreateScope())
        {
            var service = scope.ServiceProvider;
            try
            {
                var context = service.GetRequiredService<DataContext>();
                context.Database.Migrate();
            }
            catch(Exception ex)
            {
                var logger = service.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error has occured during migration");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();

            });
}

启动.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(opt => {
            opt.AddPolicy("CorsPolicy", policy =>
             {
                 policy.AllowAnyHeader().AllowAnyMethod().WithOrigins("http://localhost:3000");

             });
        });
        services.AddMediatR(typeof(List.Handler).Assembly);
        services.AddControllers();
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" });
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseSwagger();
            app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1"));
        }

        app.UseRouting();

        app.UseAuthorization();
        app.UseCors("CorsPolicy");

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

每当我运行程序时,它都会卡在var host = CreateHostBuilder(args).Build();后面跟着错误

标签: c#.netasp.net-web-apistartupmediatr

解决方案


进一步查看错误消息,您会注意到以下句子:

Unable to resolve service for type 'Domain.DataContext' while attempting to activate 'Application.Activities.List+Handler'

这就是说依赖注入设置Startup.cs不知道如何实例化Domain.DataContext.

在调用services.AddDbContext<DataContext>();之前添加.services.AddMediatR(typeof(List.Handler).Assembly);ConfigureServices

有关如何设置 Entity Framework Core 的更多信息,请访问MSDN 教程


推荐阅读