C# ASP.NET核心依赖项注入问题

C# ASP.NET核心依赖项注入问题,c#,asp.net-core,dependency-injection,repository-pattern,unit-of-work,C#,Asp.net Core,Dependency Injection,Repository Pattern,Unit Of Work,我有一个小型ASP.NET项目,我正在尝试使用Repository/UnitOfWork体系结构原则。一切都应该正常工作,但是,我经常遇到启动文件中的依赖性问题。我不确定我在这里哪里出错了。非常感谢您的帮助 错误: 处理请求时发生未处理的异常。 InvalidOperationException:尝试激活“Project.Controllers.UsersController”时,无法解析类型“Project.UOW.IUnitOfWork”的服务 上述错误仅在我将IUnitOfWork作为依赖

我有一个小型ASP.NET项目,我正在尝试使用
Repository/UnitOfWork
体系结构原则。一切都应该正常工作,但是,我经常遇到
启动
文件中的依赖性问题。我不确定我在这里哪里出错了。非常感谢您的帮助

错误:

处理请求时发生未处理的异常。 InvalidOperationException:尝试激活“Project.Controllers.UsersController”时,无法解析类型“Project.UOW.IUnitOfWork”的服务

上述错误仅在我将IUnitOfWork作为依赖项注入启动文件时发生。如果我添加所有三个依赖项,我会得到一个不同的错误,结果是=>

“HTTP错误502.3-网关错误。指定的CGI应用程序遇到错误,服务器终止了该进程。”

i推定:

public interface IRepository<TEntity> where TEntity : class 
{
    Task<TEntity> GetById(int id);
    Task<IEnumerable<TEntity>> GetAll();
}
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();
        }
}
  public interface IUserRepository : IRepository<User>
  {
        Task<IEnumerable<User>> GetAllUsers();
        IEnumerable<User> GetUserById(int Id);
  }
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();
    }
}
}

i工作内容:

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();
        }
 public interface IUnitOfWork : IDisposable
 {
        IUserRepository User { get; set; }
        int Complete();
 }
启动:

services.AddScoped<IUnitOfWork, UnitOfWork>();
services.AddTransient<IUserRepository, UserRepository>();
services.AddTransient(typeof(IRepository<>), typeof(Repository<>));
services.addScope();
services.AddTransient();
AddTransient(typeof(IRepository)、typeof(Repository));
用户控制器:

 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);
        }
}
公共类用户控制器:控制器
{
私人工作单位;
公共用户控制器(IUnitOfWork unitOfWork)
{
_unitOfWork=unitOfWork;
}
//获取:用户
公共异步任务索引()
{
var getAllUsers=_unitOfWork.User.getAllUsers();
返回视图(等待获取用户);
}
}

这个问题似乎通过启动一个新项目就自行解决了。谢谢大家的帮助

您的dbcontext和任何依赖它的内容都应该注册为作用域。框架会自动为每个web请求创建一个作用域,并在请求结束时自动处理IDisPobles。谢谢您的回复,Joe。在启动文件中会是什么样子?我应该只放置=>services.addScope();然后把其他的都拿走?@ChrisH。您不需要这两个临时服务,因为它们并不是真正注入到任何地方,它们只是用作类型检查。您的
UnitOfWork
不需要实现
IDisposable
,因为这是由服务在请求结束时自动完成的。您的
UserRepository
也从
Repository
继承了两次。@AntonToshik,这似乎不起作用。我已经从UnitOfWork中删除了临时服务和IDisposable。我不确定我错在哪里。你能在问题中发布DbContext的your register Ioc容器吗?
 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);
        }
}