我正在实现一个审核表,并且我覆盖了savechangesasync,但是我需要检索用户ID,但是我在上下文类中无法访问httpcontextaccessor,因为它在解决方案中的另一个项目中,,我想在savechangesasync.ive中作为参数发送它,得到了两个表:person {id,name,phone}和可唤起的{id,键,oldvalues,newvalues,date,userId}。
我的解决方案有两个项目网络,我的控制器在这里,以及一个数据项目,在上下文和模型clasess所在。我像这样覆盖Savechangesasync:
public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
{
var auditEntries = OnBeforeSaveChanges();
var result = await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
await OnAfterSaveChanges(auditEntries);
return result;
}
等待_context.savechangesasync(userId(还是还有其他更好的方法?谢谢
此接口位于您的数据项目中:
public interface IUserIdProvider
{
int UserId { get; }
}
此实现位于您的Web项目中:
public class UserIdProvider : IUserIdProvider
{
private readonly IHttpContextAccessor _contextAccessor;
public UserIdProvider(IHttpContextAccessor contextAccessor)
{
_contextAccessor = contextAccessor;
}
public int UserId
{
get
{
var nameId = _contextAccessor.HttpContext.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
return nameId != null ? int.Parse(nameId.Value) : -1;
}
}
}
我假设您在网络项目中注册您的服务:
services.AddScoped<IUserIdProvider, UserIdProvider>();
然后在您的dbcontext中注入 IUserIdProvider
:
public partial class MyDbContext
{
private IUserIdProvider _userIdProvider;
public MyDbContext(DbContextOptions<MyDbContext> options, IUserIdProvider userIdProvider) : base(options)
{
_userIdProvider = userIdProvider;
}
public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
{
//do you what you need with _userIdProvider here
var result = await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
return result;
}
}