c# - 我在 >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();
后面跟着错误
解决方案
进一步查看错误消息,您会注意到以下句子:
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 教程。
推荐阅读
- python - 如何从打开的选项卡中抓取网站
- javascript - 使用 div 重新打开对话框时,Jquery 对话框图标消失
- swift - 如何对具有多个配置的项目进行单元测试
- mysql - 如何使用多内连接进行分组
- python - 如何修复这些错误?
- ruby-on-rails - 运行 Rails 测试时无法在 WSL 中找到 chrome 二进制文件
- xamarin - Xamarin 将 sqllite 文件上传到 Azure Blob 存储,sqlite .db3 文件在 Blob 存储上为空
- vba - 如何从导航表单中重新查询表单?
- performance-testing - 如何在 java-user 协议(Load runner)中的 vugen 中创建 GUID?
- sql-server - 如何使 SQl Server 将数据重新导入 CDC 表?