我尝试实现 UnitOfWork 赞助人,当执行我的应用程序时,访问数据库后,收到错误:System.ObjectDisposeException:'无法访问已处置的上下文实例
这是我在模型中的 OnPost 方法:
Register.cshtml
public async void OnPost(string name, string email, string emailConfirm, string password, string passworConfirm)
{
try
{
var user = mapUser(name, email, password);
await _securityService.RegisterNewUserAsync(user);
}
catch
(Exception ex)
{
}
}
这是我的 RegisterNewUser 方法失败的部分(_userService.GetByNameOrEmailAsync)
namespace CompanyMannager.Services.Security
{
public class SecurityService : ISecurityService
{
private readonly IUserService _userService;
public SecurityService(IUserService userService)
{
_userService = userService;
}
public async Task RegisterNewUserAsync(User user)
{
// var userTokenService = new UserTokenService(_unitOfWork);
var users = await _userService.GetByNameOrEmailAsync(user.Name, user.Email);
if (users.Any())
{
throw new DuplicateNameException("The name or email is already in use, please try when other email and name.");
}
await _userService.CreateUser(user, Convert.ToBase64String(salt));
}
}
}
这是用户服务:
namespace CompanyMannager.Services
{
public class UserService : IUserService
{
private readonly IUnitOfWork _unitOfWork;
public UserService(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public async Task<IEnumerable<User>> GetByNameOrEmailAsync(string name, string email)
{
return await _unitOfWork._userRepository.GetAsync(x => x.Name == name || x.Email == email);
}
}
}
这是用户存储库:
public class UserRepository : BaseRepository<User>, IUserRepository
{
public UserRepository(CompanyMannagerDBContext context) : base(context)
{
}
}
它是基础存储库:
public class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : class
{
private readonly CompanyMannagerDBContext _Context;
internal DbSet<TEntity> dbSet;
public BaseRepository(CompanyMannagerDBContext context)
{
_Context = context;
dbSet = context.Set<TEntity>();
}
public async Task<IEnumerable<TEntity>> GetAsync(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
query = query.Where(filter);
foreach (var includeProperty in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
return await orderBy(query).ToListAsync();
else
return await query.ToListAsync();
}
}
}
这是工作单元:
public class UnitOfWork : IUnitOfWork
{
public IUserRepository _userRepository { get; }
public IUserTokenRepository _userTokenRepository { get; }
private readonly CompanyMannagerDBContext _context;
public UnitOfWork(CompanyMannagerDBContext context, IUserRepository userRepository, IUserTokenRepository userTokenRepository)
{
_context = context;
_userRepository = userRepository;
_userTokenRepository = userTokenRepository;
/* public IUserRepository UserRepository => _userRepository ??= new UserRepository(_context);
public IUserTokenRepository UserTokenRepository => _userTokenRepository ??= new UserTokenRepository(_context); */
}
public async Task<int> CommitAsync()
{
return await _context.SaveChangesAsync();
}
public void Dispose()
{
_context.Dispose();
}
}
}
我的错误是什么?
谢谢
我尝试修改依赖注入,因为我是新手,但错误仍然存在
我更改了代码以使用基本 EF,如果错误仍然存在:
System.ObjectDisposeException:“无法访问已处置的上下文实例。导致此错误的一个常见原因是处置从依赖项注入解析的上下文实例,然后尝试在应用程序的其他位置使用相同的上下文实例。如果您在上下文实例上调用“Dispose”或将其包装在 using 语句中,则可能会发生这种情况。如果您使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例。 ObjectDispose_ObjectName_Name'
CompanyMannager.Services.UserService.GetByNameOrEmailAsync(string, string) en UserService.csCompanyMannager.Services.Security.SecurityService.RegisterNewUserAsync(CompanyMannager.Core.Entities.User) en SecurityService.cs CompanyMannager.UI.Areas.Identity.Pages.RegisterModel.OnPost(string, string, string, string, string) en Register.cshtml.cs
注册.cshtml:
public async void OnPost(string name, string email, string emailConfirm, string password, string passworConfirm)
{
try
{
var user = mapUser(name, email, password);
await _securityService.RegisterNewUserAsync(user);
}
catch
(Exception ex)
{
}
}
SecurityService.cs:
{
public class SecurityService : ISecurityService
{
private readonly IUserService _userService;
public SecurityService(IUserService userService)
{
_userService = userService;
}
public async Task RegisterNewUserAsync(User user)
{
var users = await _userService.GetByNameOrEmailAsync(user.Name, user.Email);
if (users.Any())
{
throw new DuplicateNameException("The name or email is already in use, please try when other email and name.");
}
}
}
}
UserService.cs:
{
public class UserService : IUserService
{
private readonly CompanyMannagerDBContext _companyMannagerDBContext;
public UserService(CompanyMannagerDBContext context)
{
_companyMannagerDBContext = context;
}
public async Task<IEnumerable<User>> GetByNameOrEmailAsync(string name, string email)
{
return await _companyMannagerDBContext.Users.Where(x => x.Name == name || x.Email == email).ToListAsync();
}
}
}
用户.cs
public partial class User
{
public int UserId { get; set; }
public string? Name { get; set; }
public string? NormalizedName { get; set; }
public string? PasswordHash { get; set; }
public string? CreateUser { get; set; }
public DateTime? CreateDate { get; set; }
public string? LastUpdatedUser { get; set; }
public DateTime? LasteUpdatedDate { get; set; }
public string? Email { get; set; }
public string? NormalizeEmail { get; set; }
public string? EmailVerified { get; set; }
public DateTime? ExpirationDate { get; set; }
public User() { }
}
我没有找到错误,请帮助我!