2

나는 ActionMethods 다양한 장식을 사용하는 간단한 사용자 정의 FilterAttribute을 가지고 있습니다.ASP.NET MVC FilterAttribute에서 Dependency Injection/IoC를 사용할 수 있습니까?

예 :

[AcceptVerbs(HttpVerbs.Get)] 
[MyCustomFilter] 
public ActionResult Bar(...) 
{ ... } 

지금, 정말 좋은 소년 인 나는 DI/IoC를 사용하여 ... 그리고 내 사용자 지정 FilterAttribute이 패턴을 사용하는 등의 소원으로하고 있습니다 ..이에는, customFilter 작업에 일부 로깅을 추가하고 싶습니다. 내가 다음 ...

ILoggingService 

을 가지고이 내 사용자 지정 FilterAttribute를 추가하려면

그래서 .. 어떻게 모르겠어요. 마찬가지로, 내가 다음을 수행하는 것이

public class MyCustomFilterAttribute : FilterAttribute 
{ 
    public MyCustomFilterAttribute(ILoggingService loggingService) 
    { ... } 
} 

... 쉽게하지만 컴파일러 오류가 장식 속성을 말하는 내 ActionMethod 난 그냥 해요 그래서 1 인수 .. 필요 (... 위) 확실하지 무엇을 :(당신이 당신의 자신의 IActionInvoker를 작성하고 속성 주입을 할 필요가

답변

3

내가 Ninject과 작업 특성 주입있어 Ninject.Web.MVC.

Ninject.Web.MVC에서 컨트롤러 팩토리를 얻는 한 오히려 간단합니다.

예.

public class EventExistsAttribute : FilterAttribute, IActionFilter 
{ 
    [Inject] 
    public IEventRepository EventRepo { private get; set; } 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //Do stuff 
    } 

    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     //Do something else if you so wish... 
    } 
} 

본질적으로 '숨겨진'종속성이있는 단점이 있습니다.하지만 그렇게 할 수있는 방법은 많지 않습니다.

HTHs,
찰스

2

을. 아이디어 지미 Bogard에 의해 this 포스트에서보세요.

2

네,이 FilterAttribute에 의존성 주입을 사용하는 것이 가능하다. 그러나 FilterAttribute에 생성자 삽입을 사용할 수 없습니다. 이것은 ASP.NET MVC의 제한 사항이 아니며 모든 .Net 코드에 공통적으로 사용됩니다 (the values passed into an attributes constuctor are limited to simple types).

[MyFilter(ILogger logger)] // this will not compile 
public ActionResult Index() 
{ 
    return View(); 
} 

그래서 일반적인 관행은 @ Charlino의 예에서와 같이 종속성을 필터의 특성을 확인하는 것입니다. 그런 다음 속성 주입을 사용할 수 있습니다. Ninject를 사용하여 @ Charlino의 예와 같이 필터 속성을 꾸밀 수 있습니다. 또는 @mrydengren이 제안한대로 ControllerActionInvoker의 사용자 정의 하위 클래스에서이 작업을 수행 할 수 있습니다.

관련 문제