레코드가 업데이트 될 때 CreatedByUserId
및 ModifiedByUserId
을 저장할 수 있도록 DBContext에서 현재 사용자에 대한 세부 정보를 얻으려고합니다.종속성은 MVC의 별도 어셈블리에있는 DBContext에 IPrincipal을 삽입합니다.
은 내가 찾는거야 것은 주입 된 IPrincipal 인스턴스가 컨트롤러에 대한 유효하다고하지만, 별도의 어셈블리에 내 DB 컨텍스트에 주입 할 때 null입니다.
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 생성자의 모습을 다음과 같이 내가 Autofac에 주입하고 있어요
여기 및 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 컨텍스트에서 신원을 얻기 위해이 코드를 사용하는 경우 I 성공적으로 사용자가 얻을 수 있습니다 :
var user = System.Threading.Thread.CurrentPrincipal;
을하지만이 같은 두 가지 방법으로 사용자를 받고 문제로 실행 할 수처럼 보인다 app을 사용하고, DI가 HTTP 프로젝트의 사용자를 웹 프로젝트에 반환하고 스레드의 주체를 다른 어셈블리로 반환하도록 만드는 방법을 알아야합니다. 모두 잘못된 솔루션이 될 수 있습니다.
사람은 제가 위의 행동을보고 있어요 이유를 정확히 이해하고 MVC 응용 프로그램의 다른 어셈블리의 주체를 얻을 수있는 가장 좋은 방법에 대한 조언을 도와 드릴까요? 이 라인의 DB 컨텍스트를 설정할 때