Мне нужно отправить "идентификатор пользователя" в методе savechangesasync - PullRequest
1 голос
/ 02 мая 2019

Я реализую таблицу аудита и переопределяю savechangesasync, но мне нужно получить идентификатор пользователя, но у меня нет доступа к HttpContextAccessor в моем классе контекста, потому что он находится в другом проекте в решении, я хочу отправить его как Аргумент в savechangesasync.Ive получил две таблицы: Person {id, name, phone} и audtabletable {id, keys, oldvalues, newvalues, date, userid}.

Мое решение имеет два веб-проекта, в которых находятся мои контроллеры, и проект данных, в котором находятся контекст и модели. Я перезаписываю 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;
    }

await _context.saveChangesAsync (идентификатор пользователя) Или есть другой способ получше? Спасибо

1 Ответ

3 голосов
/ 02 мая 2019

Этот интерфейс находится в вашем проекте данных:

public interface IUserIdProvider
{
    int UserId { get; }
}

Эта реализация находится в вашем веб-проекте:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...