1

IAuthenticationFilter을 구현하여 사용자 정의를 생성했습니다. 생성자 나는 structureMap을 사용하여 IUnitOfWork의 인스턴스를 가져옵니다. 이 인증 로직은 내가 IUnitOfWork HttpContextScoped를 제공하기 위해 structureMap를 구성asp.net MVC : ActionFilters가 요청 당일 때 customAttribute 내에서 unitOfWork를 사용 하시겠습니까?

IUnitOfWork uow; 

public CustomAuthenticatationAttribute() 
{ 
    this.uow = ObjectFactory.GetInstance<IUnitOfWork>(); 
} 

.... 데이터베이스에서 사용자의 상태를 확인하는 것입니다.

x.For<IUnitOfWork>().HttpContextScoped().Use(() => new MyDbContext()); 

하지만 이상한 일이있었습니다. 한 작업에서 사용자를 삭제했지만 다른 작업에서 AuthenticationFilter가 실행될 때 unitOfWork의 인스턴스가 여전히 사용자를 반환합니다! 나는 시간 동안 웹을 검색하고 나는이 와서 : 짧은

Are ActionFilterAttributes reused across threads? How does that work?

, 그것은 필터 캐시 및 요청에 걸쳐 사용되는 것을 말한다!

이제 혼란스러워합니다. 이 문제를 어떻게 처리할까요? unitOfWork을 사용하여 포기하고 using(var context = ....)으로 돌아 가야하나요? 또는 필터 내부에 unitOfWork을 사용하는 올바른 방법이 있습니다.

나는 그것은 DefaultFilterProvider 대체하고 내가 그 가능하면 피하기 위해 선호 여기

https://gist.github.com/ivanra/9019273

해결책을 발견했다.

답변

1

FilterProvider에서 캐싱을 억제하여 찾은 솔루션은 실제로 Autofac 및 Simple Injector 사용을위한 MVC 통합 라이브러리와 동일한 솔루션입니다.

하지만 속성의 캐싱 동작은 단지 one of the many reasons이고 속성에서 종속성 삽입을하는 것은 실제로 나쁜 생각입니다.

속성 논리 및 해당 종속성을 구성 요소에 캡슐화하거나 최소한 캡슐화하고 OnActionExecuting 메서드에서 해당 구성 요소를 확인하고 실행하는 것 이상을 수행하지 않는 것이 가장 좋은 해결책은 passive attributes으로 이동하는 것입니다. 예 :

public class CustomAuthenticatationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     var action = 
      ObjectFactory.GetInstance<IActionFilter<CustomAuthenticatationAttribute>>(); 

     action.OnActionExecuting(this, context); 
    } 
} 
관련 문제