【发布时间】:2018-04-26 01:05:08
【问题描述】:
我试图在我的 DBContext 中获取有关当前用户的详细信息,以便在更新记录时存储CreatedByUserId 和ModifiedByUserId。
我发现注入的 IPrincipal 实例对控制器有效,但在注入到位于单独程序集中的数据库上下文中时为空。
我正在使用 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 在此处为空:
public partial class AppDbContext : System.Data.Entity.DbContext, IAppDbContext
{
public AppDbContext(IPrincipal principal)
: this("Name=SqlConnection", principal)
{
var user = principal;
}
控制器代码在数据库上下文代码之前被调用,所以这不是时间问题,所以我猜这里的问题是数据库上下文代码运行在与具有不同身份的控制器不同的线程上?
如果我使用此代码在我的数据库上下文中获取身份,我可以成功获取用户:
var user = System.Threading.Thread.CurrentPrincipal;
但似乎我可能会在同一个应用程序中以两种不同的方式获取用户时遇到问题,我需要找到一种方法让 DI 将 HTTPContext 的用户返回到 Web 项目,并将线程的主体返回到另一个程序集,所有这些都带有错误解决方案的味道?
谁能帮助我准确理解为什么我会看到上述行为,并建议在 mvc 应用程序的不同程序集中获取主体的最佳方法?
【问题讨论】:
标签: asp.net-mvc dependency-injection asp.net-mvc-5 entity-framework-6