Home > Mobile >  Blazor Server app - Some services are not able to be constructed
Blazor Server app - Some services are not able to be constructed

Time:01-15

I am trying to write a simple Blazor Server app (which I have done before) and I am getting a 'System.AggregateException' error when the app tries to build.

Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: CrispyAcers.Services.IFarmService Lifetime: Transient ImplementationType: CrispyAcers.Services.FarmService': Unable to resolve service for type 'Microsoft.EntityFrameworkCore.IDbContextFactory`1[CrispyAcers.Models.FarmContext]' while attempting to activate 'CrispyAcers.Services.FarmService'.)

This is my Program.cs:

var builder = WebApplication.CreateBuilder(args);


// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();

builder.Services.AddDbContext<FarmContext>(option =>
    option.UseSqlServer(builder.Configuration.GetConnectionString("FarmConnection")));

builder.Services.AddTransient<IFarmService, FarmService>();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

This is the FarmService I am trying to add:

public class FarmService : IFarmService
{
    private readonly IDbContextFactory<FarmContext> dbFactory;

    public FarmService(IDbContextFactory<FarmContext> context)
    {
        dbFactory = context;
    }

    public List<Animals> GetAnimalsList()
    {
        using (var context = dbFactory.CreateDbContext())
        {
            return context.Animals.ToList();
        }
    }
}

I could very easily be missing something simple which hopefully someone will catch. If I remove the FarmService the app builds fine. I have tried Scoped, Transient, and Singleton lifetimes but nothing different happens.

CodePudding user response:

For IDbContextFactory<FarmContext> service

You need to register the service of IDbContextFactory<FarmContext> type.

builder.Services.AddDbContextFactory<FarmContext>(opt =>
    option.UseSqlServer(builder.Configuration.GetConnectionString("FarmConnection")));

For IDbContext<FarmContext> service

Alternatively, you should use the IDbContext<FarmContext> service instead of IDbContextFactory<FarmContext>. Modify the FarmService as below:

public class FarmService : IFarmService
{
    private readonly IDbContext<FarmContext> _context;

    public FarmService(IDbContext<FarmContext> context)
    {
        _context = context;
    }

    public List<Animals> GetAnimalsList()
    {
        return _context.Animals.ToList();
    }
}

Reference

Database access - ASP.NET Core Blazor Server with Entity Framework Core (EF Core)

  • Related