Net Coreを使用してDbContextでユーザー情報を取得する方法

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

質問

カスタムDbContextを実装したいクラスライブラリを開発しようとしています。 DbContext SaveChangesメソッドでは、監査目的で現在のユーザーの情報(部門、ユーザー名など)を取得する必要があります。 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();
}

2つのオプションが考えられます:

  • HttpContext.Itemsを使用してユーザー情報を保持し、IHttpContextAccessorを注入し、 HttpContext.Itemsから情報を取得します(この場合、 DbContextHttpContextに依存します)。
  • HttpContext.Items代わりにThreadStaticオブジェクトを使用し、オブジェクトから情報を取得する(私は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は合法ですか? はい、理由を学ぶ