C# ASP.NET核心依赖项注入问题
我有一个小型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作为依赖
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);
}
}