Cuando ejecuto mi asp.net core 2 proyectos me sale el siguiente mensaje de error:

InvalidOperationException: no se puede resolver de servicio para el tipo ‘de Microsoft.EntityFrameworkCore.DbContext’ al intentar activar ‘ContosoUniversity.Servicio.Clase.StudentService’.

Aquí está mi proyecto de estructura:

-- solution 'ContosoUniversity'
----- ContosoUniversity
----- ContosoUniversity.Model
----- ContosoUniversity.Service

IEntityService (relacionados con el código) :

public interface IEntityService<T> : IService
 where T : BaseEntity
{
    Task<List<T>> GetAllAsync();      
}

IEntityService (relacionados con el código) :

public abstract class EntityService<T> : IEntityService<T> where T : BaseEntity
{
    protected DbContext _context;
    protected DbSet<T> _dbset;

    public EntityService(DbContext context)
    {
        _context = context;
        _dbset = _context.Set<T>();
    }

    public async virtual Task<List<T>> GetAllAsync()
    {
        return await _dbset.ToListAsync<T>();
    }
}

Entidad :

public abstract class BaseEntity { 

}

public abstract class Entity<T> : BaseEntity, IEntity<T> 
{
    public virtual T Id { get; set; }
}

IStudentService :

public interface IStudentService : IEntityService<Student>
{
    Task<Student> GetById(int Id);
}

StudentService :

public class StudentService : EntityService<Student>, IStudentService
{
    DbContext _context;

    public StudentService(DbContext context)
        : base(context)
    {
        _context = context;
        _dbset = _context.Set<Student>();
    }

    public async Task<Student> GetById(int Id)
    {
        return await _dbset.FirstOrDefaultAsync(x => x.Id == Id);
    }
}

SchoolContext :

public class SchoolContext : DbContext
{
    public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
    {
    }

    public DbSet<Course> Courses { get; set; }
    public DbSet<Enrollment> Enrollments { get; set; }
    public DbSet<Student> Students { get; set; }
}

Y, finalmente, aquí está mi de Inicio.cs clase :

public class Startup
{
    public Startup(IConfiguration configuration, IHostingEnvironment env, IServiceProvider serviceProvider)
    {
        Configuration = configuration;

        var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);


        Configuration = builder.Build();

    }

    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.AddDbContext<SchoolContext>(option =>
            option.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));


        services.AddScoped<IStudentService, StudentService>();

        services.AddMvc();
    }

    //This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

¿Qué debo hacer para resolver este problema?

AddDbContext<SchoolContext> sólo registra su específica de DbContext, SchoolContext, no de sus clases base. Trate de buscar.

OriginalEl autor mohammad | 2017-09-20

2 Comentarios

  1. 17

    StudentService espera DbContext pero el recipiente no sabe cómo resolver sobre la base de su inicio.

    Era necesario añadir explícitamente el contexto para el servicio de recolección de

    Inicio

    services.AddScoped<DbContext, SchoolContext>();
    services.AddScoped<IStudentService, StudentService>();

    O actualización de la StudentService constructor explícitamente esperar de un tipo que el contenedor sabe cómo resolver.

    StudentService

    public StudentService(SchoolContext context)
        : base(context)
    { 
        //...
    }

    OriginalEl autor Nkosi

  2. 0

    si dbcontext heredado del sistema.de datos.entidad.DbContext, a continuación, se le añadirá como que

        services.AddScoped(provider => new CDRContext());
    
        services.AddTransient<IUnitOfWork, UnitOfWorker>();
        services.AddTransient<ICallService, CallService>();

    OriginalEl autor dewelloper

Dejar respuesta

Please enter your comment!
Please enter your name here