レコードが更新されるときにCreatedByUserId
とModifiedByUserId
を格納できるように、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アプリケーションのさまざまなアセンブリでプリンシパルを取得する最良の方法について助言する誰も助けることができますか?