0

レコードが更新されるときにCreatedByUserIdModifiedByUserIdを格納できるように、DBContextで現在のユーザーの詳細を取得しようとしています。依存関係は、MVCの別のアセンブリ内のDBContextにIPrincipalを挿入します

私が見つけたのは、注入されたIPrincipalインスタンスはコントローラに対して有効ですが、別のアセンブリ内にある私のDBコンテキストに注入されるとnullになることです。

次のように私はAutofacで注入をやっている:

builder.Register(c => HttpContext.Current.User).As<IPrincipal>().InstancePerRequest(); 

builder.Register<AppDbContext>(c => new AppDbContext(GlobalHost.DependencyResolver.Resolve<IPrincipal>())).InstancePerLifetimeScope(); 

私のコントローラのコンストラクタは次のようになり、そして予想通りuserは、ここで有効になります。

public class ProductsController : Controller 
{ 
    private readonly IProductService _productService; 

    public ProductsController(IProductService productService, IPrincipal userPrincipal) 
    { 
     var user = userPrincipal; 
     _productService = productService; 
    } 

マイDBContextコンストラクタは次のようになりますこれとuserはここではnullになります:

public partial class AppDbContext : System.Data.Entity.DbContext, IAppDbContext 
{ 
    public AppDbContext(IPrincipal principal) 
     : this("Name=SqlConnection", principal) 
    { 
     var user = principal; 
    } 

コントローラーコードはDBコンテキストコードの前に呼び出されるため、タイミングの問題ではないので、ここではDBコンテキストコードが別のスレッドで別のIDで実行されている可能性があります。

私はDBのコンテキストでアイデンティティを得るために、このコードを使用している場合、私は成功したユーザーを取得することができます:

var user = System.Threading.Thread.CurrentPrincipal; 

しかし、私は同じでは2つの異なる方法でユーザーを取得して問題に遭遇する可能性があるように思えますappを使用していて、DIがHTTPプロジェクトのユーザーをWebプロジェクトに戻し、スレッドのプリンシパルを別のアセンブリに返すようにする必要があります。

私は上記の動作を見ている理由を正確に理解し、mvcアプリケーションのさまざまなアセンブリでプリンシパルを取得する最良の方法について助言する誰も助けることができますか?

答えて

1

この行にDBのコンテキストを設定するときに、ここでの問題は、私が間違っ依存リゾルバを使用していることであることが判明:

builder.Register<AppDbContext>(c => new AppDbContext(GlobalHost.DependencyResolver.Resolve<IPrincipal>())).InstancePerLifetimeScope(); 

GlobalHost.DependencyResolverは私SignalRリゾルバではなく、MVCのリゾルバを与えています。 GlobalHostビットを削除すると、代わりに私にSystem.Web.MVC.DependencyResolverが与えられ、それを使ってIPrincipalを次のように取得できます。

builder.Register<AppDbContext>(c => new AppDbContext(DependencyResolver.Current.GetService<IPrincipal>())).InstancePerRequest(); 
関連する問題