0

레코드가 업데이트 될 때 CreatedByUserIdModifiedByUserId을 저장할 수 있도록 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 컨텍스트를 설정할 때

답변

1

그래서, 문제는 여기에 내가 잘못 종속성 해결 프로그램을 사용하고 있음을 밝혀 :

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

GlobalHost.DependencyResolver는 MVC의 해결보다는 나에게 SignalR의 해결을주고있다 . GlobalHost 비트를 제거하면 그 대신에 System.Web.MVC.DependencyResolver이 나옵니다. 그러면 다음과 같이 IPrincipal을 얻을 수 있습니다.

builder.Register<AppDbContext>(c => new AppDbContext(DependencyResolver.Current.GetService<IPrincipal>())).InstancePerRequest();