Проблема внедрения зависимостей с универсальным репозиторием и конкретной службой в ASP.NET CoreC#

Место общения программистов C#
Ответить
Anonymous
 Проблема внедрения зависимостей с универсальным репозиторием и конкретной службой в ASP.NET Core

Сообщение Anonymous »

Я работаю над проектом ASP.NET Core, в котором использую общий шаблон репозитория наряду с конкретными службами. Я реализовал следующие интерфейсы и классы:
Общие интерфейсы:

Код: Выделить всё

namespace OPEG.Shared.Contracts
{
public interface IEntity
{
int Id { get; set; }
}

public interface IEntityBaseRepository where T : class, IEntity
{
Task GetAllAsync();
Task GetAllAsync(params Expression[] includeProperties);
Task GetByIdAsync(int id);
Task AddAsync(T entity);
Task AddRangeAsync(List entities);
Task UpdateAsync(int id, T entity);
Task DeleteAsync(int id);
Task DeleteRangeAsync(List entities);
}

public interface IGradeService : IEntityBaseRepository
{
Task GetAllSubjectsById(int id);
}
}
Реализация проекта API

Код: Выделить всё

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using OPEG.Shared.Contracts;
using System.Linq.Expressions;

namespace OPEG.Api.Services
{
public class EntityBaseRepository : IEntityBaseRepository where T : class, IEntity
{
private readonly OPEGContext _context;

public EntityBaseRepository(OPEGContext context)
{
_context = context;
}

public async Task AddAsync(T entity)
{
await _context.Set().AddAsync(entity);
await _context.SaveChangesAsync();
}

public async Task GetAllAsync()
{
return await _context.Set().ToListAsync();
}

public async Task GetAllAsync(params Expression[] includeProperties)
{
IQueryable query = _context.Set();
query = includeProperties.Aggregate(query, (current, includeProp) => current.Include(includeProp));
return await query.ToListAsync();
}

public async Task GetByIdAsync(int id)
{
return await _context.Set().FirstOrDefaultAsync(e => e.Id == id);
}

public async Task UpdateAsync(int id, T entity)
{
EntityEntry entityEntry = _context.Entry(entity);
entityEntry.State = EntityState.Modified;
await _context.SaveChangesAsync();
}

public async Task DeleteAsync(int id)
{
var entity = await _context.Set().FirstOrDefaultAsync(e => e.Id == id);
if (entity != null)
{
EntityEntry entityEntry = _context.Entry(entity);
entityEntry.State = EntityState.Deleted;
await _context.SaveChangesAsync();
}
}

public async Task AddRangeAsync(List entities)
{
await _context.Set().AddRangeAsync(entities);
await _context.SaveChangesAsync();
}

public async Task DeleteRangeAsync(List entities)
{
_context.Set().RemoveRange(entities);
await _context.SaveChangesAsync();
}
}

public class GradeService : EntityBaseRepository, IGradeService
{
private readonly OPEGContext _context;

public GradeService(OPEGContext context) : base(context)
{
_context = context;
}

public async Task GetAllSubjectsById(int id)
{
return await _context.Subjects.Where(s =>  s.GradeId == id).ToListAsync();
}
}
}
Регистрация DI в Program.cs:

Код: Выделить всё

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

// Generic repository registration
builder.Services.AddScoped(typeof(IEntityBaseRepository), typeof(EntityBaseRepository));

// Specific service registration
builder.Services.AddScoped();

var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Я использую платформу dotnet 8, а такжеentityframeworkcore.sqlserver иentityframeworkcore.design версии 9.0.0 (последняя) для своих проектов.
Проблема:
При запуске проекта во время регистрации DI возникает следующая ошибка:
ошибки:

1.CS0738 «GradeService» не реализует член интерфейса «IGradeService.GetAllSubjectsById(int)». 'GradeService.GetAllSubjectsById(int)' не может реализовать 'IGradeService.GetAllSubjectsById(int)', поскольку он не имеет соответствующего возвращаемого типа 'Task'.
2.CS0535 ' GradeService» не реализует член интерфейса «IEntityBaseRepository.GetAllAsync(params Expression[])'

Что я пробовал:
Проверил, что IGradeService правильно реализован в GradeService.Убедились, что используются правильные пространства имен.
Перестраивали решение несколько раз.
Зарегистрировали общий репозиторий и конкретную службу в контейнере DI.
В чем мне нужна помощь:
/>Почему я получаю эту ошибку CS0535 и CS0738 при регистрации GradeService в контейнере DI?
Правильен ли мой подход к наследованию и реализации интерфейса для IEntityBaseRepository и IGradeService?
Как я могу исправить эту проблему DI при сохранении общий шаблон репозитория?

Подробнее здесь: https://stackoverflow.com/questions/792 ... e-in-asp-n
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»