2009-06-23 4 views

답변

1

당신은 두 가지 옵션

첫 번째 옵션은 거의 하드는 소리가 아닌 사용자 정의 ActionInvoker를 작성하는 것입니다

있습니다. 이 blog post을 확인하십시오. 구체적으로 NInject를 다루지 만, Unity는 속성 삽입을 지원하므로 예제를 수정하여 Unity를 사용할 수 있습니다.

이것은 IoC 컨테이너를 연결하는 옵션이므로 권장하지 않습니다.

public class MyFilter 
{ 
    IMyService MyService {get; set;} 

    MyFilter() : MyFilter(MyUnityContainer.Resolve<IMyService>()) 
    { } 

    MyFilter(IMyService service) 
    { 
    MyService = service; 
    } 
} 
+0

나는 블로그 게시물에서 볼 수있는 솔루션을 시도했지만 누군가의 코드가 잘못입니다 :), 다른 곳 단결과 Ninject에, 또는 사이에 약간의 차이가있을 것 같습니다. 필터는 재정의 된 "InvokeExceptionFilters"에 도달 할 때까지만 읽기 전용입니다. 새 필터를 선언하고 종속성을 주입 할 수 있지만 제공된 ExceptionFilters 목록에 의존성을 주입하면 아무 일도 발생하지 않습니다. 새 필터를 만들어 기본 클래스로 전달할 수는 있지만 속성 자체에 제공된 모든 선언적 정보를 잃게됩니다. –

2

좋아, 알아 냈어.

나는 주로 그가 언급 한 블로그 게시물에서 Ben의 솔루션을 사용했습니다.

문제는 Unity가 조금 다르게 동작한다는 것입니다.

IActionFilter 및 IExceptionFilter 유형이므로 필터에 직접 종속성을 주입 할 수 없습니다. 이것은 나를 그들이 읽기 전용이라고 믿게했다. Unity가 주입하려면 명시 적 유형을 알아야합니다.

따라서 기사에서 제공하는 재정의 된 방법에서 Unity 사용자는 문제의 유형에 대한 필터를 쿼리 한 다음 빌드해야합니다.

public UnityActionInvoker(IUnityContainer container, IList<Type> typesToInject) 
     { 
      _container = container; 
      _typesToInject = typesToInject; 
     } 

는 그리고 오버라이드 (override) 된 메소드,이 같은 수행

var needsInjection = filters.Where(filter => typesToInject.Contains(filter.GetType())); 

조금 지저분한을하지만, 그것은 단지 벤에서 알 수 있듯이 분리 모든 것을 한 번 수행되어야하고, 유지합니다.

다른 문제는 필터가 해당 컨텍스트에서 읽기 전용이므로 foreach 루프 내에서 _container.BuildUp (필터)를 호출 할 수 없다는 것입니다.

1

나는 또한이 문제를 우연히 만났고 현재 해결책이있다. 위에서 설명한 솔루션과 비슷하지만 약간의 차이점이 있으며 전체 Unity 코드가 추가되었습니다.

먼저 위에서 설명한 이유로 속성 주입을 사용하고 위와 같이 Unity에서 BuildUp 메서드를 사용하여 이미 만든 필터에 속성을 주입합니다.

이렇게하려면 모든 컨트롤러가 새로운 사용자 지정 기본 클래스에서 상속받습니다. 그 기본 클래스에서 CreateActionInvoker 메서드를 재정 의하여 내 자신의 사용자 정의 ActionInvoker를 설정합니다.

Protected Overrides Function CreateActionInvoker() As System.Web.Mvc.IActionInvoker 
    Return CustomActionInvoker 
End Function 

그런 다음 CustomActionInvoker에서 GetFilters 메서드를 재정의합니다.

Protected Overrides Function GetFilters(ByVal controllerContext As ControllerContext, ByVal actionDescriptor As ActionDescriptor) As FilterInfo 
    Dim info = MyBase.GetFilters(controllerContext, actionDescriptor) 

    For Each MyAuthorizationFilter In info.AuthorizationFilters 
     MvcApplication.Container.BuildUp(MyAuthorizationFilter.GetType, MyAuthorizationFilter) 
    Next 

    For Each MyActionFilter In info.ActionFilters 
     MvcApplication.Container.BuildUp(MyActionFilter.GetType, MyActionFilter) 
    Next 

    For Each MyResultFilter In info.ResultFilters 
     MvcApplication.Container.BuildUp(MyResultFilter.GetType, MyResultFilter) 
    Next 

    For Each MyExceptionFilter In info.ExceptionFilters 
     MvcApplication.Container.BuildUp(MyExceptionFilter.GetType, MyExceptionFilter) 
    Next 

    Return info 
End Function 

위에서 말한 것과는 반대로 For Each 루프 내에 빌드 업을 수행하면 문제가 발생하지 않았습니다.또한 기존의 개체뿐만 아니라 System.Type을 사용하는 BuildUp 메서드의 다른 오버로드 중 하나를 사용하여 인터페이스를 통해 참조 된 개체 만 갖는 원래의 문제를 극복했습니다.

위의 모든 작업을 수행하면 이제 필자의 필터에 의존성을 바로 주입 할 수 있습니다.

모든 의견 및 생각은 대단히 감사하겠습니다.

건배 마이크

관련 문제