首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AggregateException:有些服务无法构建

AggregateException:有些服务无法构建
EN

Stack Overflow用户
提问于 2021-04-12 19:31:31
回答 2查看 18.3K关注 0票数 5

我在.NET 5.0中有一个项目,一切都很好--构建、执行、只是工作--直到4月10日。

现在,我在注册服务方面有很多错误。

代码语言:javascript
复制
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中注册的内容,如下所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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));
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-12 20:06:07

移除构造函数并向DbSet属性添加setter:

代码语言:javascript
复制
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--它们无法解决。

票数 6
EN

Stack Overflow用户

发布于 2022-07-07 17:21:04

检查有关服务类的构造函数,并删除任何字符串值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67064578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档