我现在已经能够让它与一个通用类以及一个组件一起工作。
访问HttpContext 用户;在ConfigureServices,在Startup.cs 添加
services.AddHttpContextAccessor();
我的CorporateUser 课程有一个CorporateUserService 课程。服务类通过构造函数注入获得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)。 Current 服务类增加了一个额外的方法
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();
}