Общие интерфейсы:
Код: Выделить всё
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);
}
}
Код: Выделить всё
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();
}
}
}
Код: Выделить всё
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();
Проблема:
При запуске проекта во время регистрации 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
Мобильная версия