我需要在保存更改异步方法中发送"userid"



我正在实现一个审核表,并且我覆盖了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;
    }
}