如何使用Net Core在DbContext中獲取用戶信息

.net-core asp.net-core c# entity-framework-core

我正在嘗試開發一個類庫,我想在其中實現自定義DbContext 。在DbContextSaveChanges方法中,我需要獲取當前用戶的信息(部門,用戶名等)以進行審計。 DbContext代碼的某些部分如下:

public override int SaveChanges()
{
    // find all changed entities which is ICreateAuditedEntity 
    var addedAuditedEntities = ChangeTracker.Entries<ICreateAuditedEntity>()
           .Where(p => p.State == EntityState.Added)
           .Select(p => p.Entity);

    var now = DateTime.Now;

    foreach (var added in addedAuditedEntities)
    {
        added.CreatedAt = now;
        added.CreatedBy = ?;
        added.CreatedByDepartment = ?
    }
    return base.SaveChanges();
}

我想到兩個選擇:

  • 使用HttpContext.Items保存用戶信息,注入IHttpContextAccessor並從HttpContext.Items獲取信息(在這種情況下, DbContext依賴於HttpContext ,它是否正確?)
  • 使用ThreadStatic對象而不是HttpContext.Items並從對象獲取信息(我讀了一些ThreadStatic不安全的帖子)

問題 :哪種情況最適合我的情況?你有其他建議嗎?

一般承認的答案

我實現了一個類似於此博客文章中介紹的方法 ,基本上涉及創建一個服務,該服務將使用依賴注入將HttpContext (和底層用戶信息)注入特定上下文,或者您更喜歡使用它。

一個非常基本的實現可能看起來像這樣:

public class UserResolverService  
{
    private readonly IHttpContextAccessor _context;
    public UserResolverService(IHttpContextAccessor context)
    {
        _context = context;
    }

    public string GetUser()
    {
       return _context.HttpContext.User?.Identity?.Name;
    }
}

您只需要將其註入Startup.cs文件中的ConfigureServices方法中的管道:

services.AddTransient<UserResolverService>();

最後,只需在指定的DbContext的構造函數中訪問它:

public partial class ExampleContext : IExampleContext
{
    private YourContext _context;
    private string _user;
    public ExampleContext(YourContext context, UserResolverService userService)
    {
        _context = context;
        _user = userService.GetUser();
    }
}

然後,您應該能夠使用_user來引用上下文中的當前用戶。這可以很容易地擴展到存儲/訪問當前請求中可用的任何內容。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因