Теперь я могу заставить его работать с общим классом, а также с компонентом.
Чтобы получить доступ к пользователю HttpContext; в ConfigureServices в Startup.cs добавьте
services.AddHttpContextAccessor();
У меня есть класс CorporateUserService для моего класса CorporateUser. Класс обслуживания получает DbContext посредством внедрения конструктора.
Затем я создал новый CurrentCorporateUserService, который наследуется от CorporateUserService. Он принимает DbContext и IHttpContextAccessor через внедрение конструктора
public class CurrentCorporateUserService : CorporateUserService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public CurrentCorporateUserService(IHttpContextAccessor httpContextAccessor, MyDbContext context) : base(context)
{
_httpContextAccessor = httpContextAccessor;
}
...
Базовый класс обслуживания имеет метод GetUserByUsername(string username)
. Текущий класс обслуживания добавляет дополнительный метод
public CorporateUser GetCurrentUser()
{
return base.GetUserByUsername(_httpContextAccessor.HttpContext.User.Identity.Name.Substring(8));
}
Текущий класс обслуживания зарегистрирован в Startup.cs
services.AddScoped<CurrentCorporateUserService>();
Как только это будет сделано, я могу использовать CurrentCorporateUserService в компоненте с внедрение директивы.
[Inject]
private CurrentCorporateUserService CurrentCorporateUserService { get; set; } =
default!;
или в любом классе, с инжекцией в конструктор.
public MyDbContext( DbContextOptions<MyDbContext> options
, CurrentCorporateUserService CurrentCorporateUserService )
: base(options)
{
_currentUser = CurrentCorporateUserService.GetCurrentUser();
}
Создание сервиса для всего проекта означает, что все мои разработчики не должны заботиться о том, как получить Текущий пользователь, им просто нужно внедрить сервис в свой класс.
Например, использование его в MyDbContext делает текущего пользователя доступным для каждого события сохранения. В приведенном ниже коде любой класс, который наследует класс BaseReport, будет автоматически обновлять метаданные отчета при сохранении записи.
public override Int32 SaveChanges()
{
var entries = ChangeTracker.Entries().Where(e => e.Entity is BaseReport
&& (e.State == EntityState.Added || e.State == EntityState.Modified));
foreach (var entityEntry in entries)
{
((BaseReport)entityEntry.Entity).ModifiedDate = DateTime.Now;
((BaseReport)entityEntry.Entity).ModifiedByUser = _currentUser.Username;
}
return base.SaveChanges();
}