我正在实现一个审计表,并且我覆盖了savechangesasync,但是我需要检索用户ID,但是我无法访问我的上下文类中的HttpContextAccessor,因为它在解决方案的另一个项目中,我想将其作为savechangesasync中的参数。我有两个表: 人{id,名称,电话}和审计表{id,键,旧值,新值,日期,用户ID}。
我的解决方案有两个项目Web,其中我的控制器是,一个数据项目是上下文和模型的分类。 我这样覆盖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) 还是还有其他更好的方法?谢谢
答案 0 :(得分:3)
此界面位于您的数据项目中:
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;
}
}
}
我假设您在Web项目中注册了服务:
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;
}
}