У меня есть мини-проект ASP.NET, где я пытаюсь использовать принцип архитектуры Repository/UnitOfWork
. Все должно работать как надо, однако я постоянно сталкиваюсь с проблемой зависимости в моем файле StartUp
. Я не уверен, где я иду не так здесь. Любая помощь очень ценится.
Ошибка:
Произошло необработанное исключение при обработке запроса.
InvalidOperationException: невозможно разрешить службу для типа «Project.UOW.IUnitOfWork» при попытке активировать «Project.Controllers.UsersController».
Вышеуказанная ошибка возникает, только когда я внедряю IUnitOfWork в качестве зависимости в файле запуска. Если я добавлю все три зависимости, я получу другую ошибку с эффектом =>
"Ошибка HTTP 502.3 - Bad Gateway. В указанном приложении CGI обнаружена ошибка, и сервер завершил процесс."
Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired)
IRepository:
public interface IRepository<TEntity> where TEntity : class
{
Task<TEntity> GetById(int id);
Task<IEnumerable<TEntity>> GetAll();
}
Repository:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
private readonly DbContext _context;
public Repository(DbContext context)
{
_context = context;
}
public async Task<TEntity> GetById(int id)
{
return await _context.Set<TEntity>().FindAsync(id);
}
public async Task<IEnumerable<TEntity>> GetAll()
{
return await _context.Set<TEntity>().ToListAsync();
}
}
IUserRepository:
public interface IUserRepository : IRepository<User>
{
Task<IEnumerable<User>> GetAllUsers();
IEnumerable<User> GetUserById(int Id);
}
UserRepository:
public class UserRepository : Repository<User>, IUserRepository
{
public UserRepository(DbContext context)
: base(context)
{
}
public IEnumerable<User> GetUserById(int Id)
{
return Context.User.Where(p => p.UserId == Id).ToList();
}
public async Task<IEnumerable<User>> GetAllUsers()
{
return await Context.User.ToListAsync();
}
}
UnitOfWork:
public class UnitOfWork : IUnitOfWork
{
private DbContext _context;
public UnitOfWork(DbContext context)
{
_context = context;
User = new UserRepository(_context);
}
public IUserRepository User { get; set; }
public int Complete()
{
return _context.SaveChanges();
}
public void Dispose()
{
_context.Dispose();
}
}
IUnitOfWork:
public interface IUnitOfWork : IDisposable
{
IUserRepository User { get; set; }
int Complete();
}
Запуск:
services.AddScoped<IUnitOfWork, UnitOfWork>();
services.AddTransient<IUserRepository, UserRepository>();
services.AddTransient(typeof(IRepository<>), typeof(Repository<>));
UserController:
public class UsersController : Controller
{
private IUnitOfWork _unitOfWork;
public UsersController(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
// GET: Users
public async Task<IActionResult> Index()
{
var getAllUsers = _unitOfWork.User.GetAllUsers();
return View(await getAllUsers);
}
}