여기에 설정이 있습니다. 서비스 인스턴스가 필요한 작업 필터가 있다고 가정 해 보겠습니다.
public interface IMyService
{
void DoSomething();
}
public class MyService : IMyService
{
public void DoSomething(){}
}
그런 다음 해당 서비스의 인스턴스가 필요한 ActionFilter가 있습니다.
public class MyActionFilter : ActionFilterAttribute
{
private IMyService _myService; // <--- How do we get this injected
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_myService.DoSomething();
base.OnActionExecuting(filterContext);
}
}
MVC 1/2에서 의존성을 액션 필터에 주입하는 것은 엉덩이에 약간의 고통이었습니다. 여기서 볼 수 있듯이 가장 일반적인 방법은 사용자 지정 작업 호출자를 사용하는 것이었다 : http://www.jeremyskinner.co.uk/2008/11/08/dependency-injection-with-aspnet-mvc-action-filters/ 이 해결 방법의 주된 동기는 다음과 같은 접근 방식이 컨테이너와 조잡하고 긴밀한 결합으로 간주 되었기 때문입니다.
public class MyActionFilter : ActionFilterAttribute
{
private IMyService _myService;
public MyActionFilter()
:this(MyStaticKernel.Get<IMyService>()) //using Ninject, but would apply to any container
{
}
public MyActionFilter(IMyService myService)
{
_myService = myService;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_myService.DoSomething();
base.OnActionExecuting(filterContext);
}
}
여기서는 생성자 주입을 사용하고 생성자를 오버로드하여 컨테이너를 사용하고 서비스를 주입합니다. 컨테이너를 ActionFilter와 밀접하게 연결하는 것에 동의합니다.
그래도 내 질문은 이것이다 : 이제 ASP.NET MVC 3에서 사용되는 컨테이너의 추상화가있는 곳 (DependencyResolver를 통해)이 모든 고리가 여전히 필요합니까? 내가 시연하도록 허용 :
public class MyActionFilter : ActionFilterAttribute
{
private IMyService _myService;
public MyActionFilter()
:this(DependencyResolver.Current.GetService(typeof(IMyService)) as IMyService)
{
}
public MyActionFilter(IMyService myService)
{
_myService = myService;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_myService.DoSomething();
base.OnActionExecuting(filterContext);
}
}
이제 일부 순수 주의자들이 이것을 비웃을 수도 있다는 것을 알고 있지만, 진지하게 단점은 무엇일까요? 테스트 시간에 IMyService를 사용하고 그런 방식으로 모의 서비스를 삽입하는 생성자를 사용할 수 있으므로 여전히 테스트 할 수 있습니다. DependencyResolver를 사용하고 있기 때문에 DI 컨테이너 구현에 묶여 있지 않은데,이 접근 방식에 단점이 있습니까?
여기에 새로운 IFilterProvider 인터페이스를 사용하여 MVC3에서이 작업을 수행하는 또 다른 좋은 방법이 있습니다. http://www.thecodinghumanist.com/blog/archives/2011/1/27/structuremap-action-filters-and-dependency-injection-in -asp-net-mvc-3