我在.NET 5.0中有一个项目,一切都很好--构建、执行、只是工作--直到4月10日。
现在,我在注册服务方面有很多错误。
Unhandled exception. System.AggregateException: Some services are not able to be constructed
(Error while validating the service descriptor 'ServiceType: AService.DataAccess.MyDbContext
Lifetime: Scoped ImplementationType: AService.DataAccess.MyDbContext': Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbSet`1[AService.Domain.Entities.B.B]' while
attempting to activate 'AService.DataAccess.MyDbContext'.) (Error while validating the
service descriptor 'ServiceType:
MediatR.IRequestHandler`2[AService.Api.Queries.B.GetAllQuery,
System.Collections.Generic.IEnumerable`1[AService.Api.Queries.B.Dtos.BDto]]
Lifetime: Transient ImplementationType:
AService.Queries.B.GetAllQueryHandler': Unable to resolve service for type
'Microsoft.EntityFrameworkCore.DbSet`1[AService.Domain.Entities.B.B]' while
attempting to activate 'AService.DataAccess.MyDbContext'.)我缩短了每个存储库、每个服务、所有需要注册并在Startup.cs中注册的内容,如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddNewtonsoftJson(options =>
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);
services.AddDbContext<MyDbContext>();
services.AddStackExchangeRedisExtensions<NewtonsoftSerializer>((options) =>
Configuration.GetSection("Redis").Get<RedisConfiguration>());
services.AddMediatR(Assembly.GetExecutingAssembly());
services.AddTransient<IARepository, ARepository>();
services.AddTransient<IBRepository, BRepository>();
services.AddTransient<ICRepository, CRepository>();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo {Title = "Service API", Version = "v1.0"});
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseRouting();
app.UseCors();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Menu Service API v1.0");
});
}Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}我不知道这是否与Rider版本(我在macos上编程)有问题。调试时,我收到以下错误消息:
IL变量在当前本机IP中不可用。(0x80131304)。错误代码是CORDBG_E_IL_VAR_NOT_AVAILABLE,或0x80131304。
有谁知道什么会导致这个错误吗?正如我在一开始所说的,几天前一切都很好。
编辑添加的MyDbContext:
public class MyDbContext : DbContext
{
public MyDbContext(DbSet<A> a, DbSet<B> b, DbSet<C> c)
{
As = a;
Bs = b;
Cs = c;
}
public DbSet<A> As { get; }
public DbSet<B> Bs { get; }
public DbSet<C> Cs { get; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=localhost;Database=my-db;User=user;Password=password");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<B>()
.HasOne(mi => mi.A)
.WithMany(m => m.Bs)
.HasForeignKey(mi => mi.AId);
modelBuilder.Entity<B>()
.Property(mi => mi.Xs)
.HasConversion(
a => string.Join(',', a),
a => a.Split(',', StringSplitOptions.RemoveEmptyEntries));
}
}发布于 2021-04-12 20:06:07
移除构造函数并向DbSet属性添加setter:
public class MyDbContext : DbContext
{
public DbSet<A> As { get; private set; } // or public setters
public DbSet<B> Bs { get; private set; }
public DbSet<C> Cs { get; private set; }
.....
}DI容器使用构造函数来实现它的魔力,并尝试解析和注入所有构造器参数。因为您没有(也不应该)注册DbSet--它们无法解决。
发布于 2022-07-07 17:21:04
检查有关服务类的构造函数,并删除任何字符串值。
https://stackoverflow.com/questions/67064578
复制相似问题