4

ASP.NET MVC 3과 Ninject 2.2를 사용하여 로거 객체를 사용자 정의 ActionFilterAttribute에 삽입 할 수있었습니다. 이 post에 수신되었습니다.MVC 3을 사용하여 영역의 모든 컨트롤러에 전역 작업 필터 바인딩 Ninject 2.2와의 종속성 삽입

이제 사용자 정의 ActionFilterAttribute를 특정 영역에있는 모든 컨트롤러에만 바인딩하고 싶습니다.

다음 바인딩으로 시작할 수 있었지만 특정 영역의 컨트롤러 하나만 처리했습니다. 내 코드를 특정 영역의 모든 컨트롤러에 바인딩하고 싶습니다. 어떤 아이디어?

/// <summary> 
/// Load your modules or register your services here! 
/// </summary> 
/// <param name="kernel">The kernel.</param> 
private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<ILogger>().To<Log4NetLogger>().InRequestScope(); 
    kernel.BindFilter<TestLoggingAttribute>(
     FilterScope.Controller, 0) 
      .WhenControllerType<OrganizationController>(); 
} 

답변

6

, 감사 대린. 그러나 context.RouteData.Values는 나를위한 영역이 아니라 context.RouteData.DataTokens [ "영역"] 않았다! 내 경우에는 특정 영역 (예 : 공유 컨트롤러)에 있지 않은 컨트롤러가 있었기 때문에 null이되도록 datatoken 영역을 확인해야했습니다. 이것이 나를 위해 일한 것입니다 :

kernel 
    .BindFilter<TestLoggingAttribute>(FilterScope.Controller, 0) 
    .When((context, ad) => context.RouteData.DataTokens["area"] != null && context.RouteData.DataTokens["area"] == "Organization"); 
5
kernel 
    .BindFilter<TestLoggingAttribute>(FilterScope.Controller, 0) 
    .When((context, ad) => context.RouteData.Values["area"] == "YourAreaName"); 

또는이 나를 도와

kernel 
    .BindFilter<TestLoggingAttribute>(FilterScope.Controller, 0) 
    .When((context, ad) => context.Controller.GetType().FullName.Contains("Areas.YourAreaName"));