2013-11-26 4 views
6

현재 작업중인 ASP.Net MVC 4 응용 프로그램에는웨어 하우스 속성이있는 여러 모델이 있습니다. 이 모든 모델에 입력 된웨어 하우스가 유효한웨어 하우스인지 확인하는 유효성 검사가 필요합니다. 이 작업을 수행하는 가장 쉬운 방법은 사용자 지정 ValidationAttribute 클래스를 사용하는 것 같았습니다. 그런 다음 유효성 검사 코드가 중앙 집중화되고 각 모델의 속성에 속성을 추가 할 수 있습니다.ASP.Net MVC 4 사용자 지정 ValidationAttribute 종속성 주입

웨어 하우스가 유효한 창고인지 확인하려면 서비스를 호출해야합니다. 이 서비스를 나타내는 인터페이스가 있고이 서비스가 사용되는 응용 프로그램에서 종속성 주입을 수행하기 위해 Ninject를 사용하고 있습니다. 그렇게하면 조롱을 사용하고 응용 프로그램에서 단위 테스트를 쉽게 수행 할 수 있습니다.

내 맞춤형 ValidationAttribute 클래스가이 서비스를 사용할 때 종속성 주입을 사용하도록하고 싶습니다. 다음은 내가 생성 한 클래스입니다.

public class MustBeValidWarehouse : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
    if (value is string) 
    { 
     string warehouse = value.ToString(); 
     NinjectDependencyResolver depres = new NinjectDependencyResolver(); 
     Type inventServiceType = typeof(IInventService); 
     IInventService inventserv = depres.GetService(inventServiceType) as IInventService; 
     return (inventserv.GetWarehouses().Where(m => m.WarehouseId == warehouse).Count() != 0); 

    } 
    else 
    { 
     return false; 
    } 
    } 
} 


public class NinjectDependencyResolver : IDependencyResolver 
{ 
    private IKernel kernel; 
    public NinjectDependencyResolver() 
    { 
     kernel = new StandardKernel(); 
     AddBindings(); 
    } 

    public object GetService(Type serviceType) 
    { 
     return kernel.TryGet(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return kernel.GetAll(serviceType); 
    } 

    private void AddBindings() 
    { 
     kernel.Bind<IInventService>().To<InventService>(); 
    } 
} 

종속성 삽입이 제대로 작동하지만 테스트하기 쉽지 않습니다. 단위 테스트에서 클래스에 mock IInventService를 삽입 할 수있는 방법은 없습니다. 일반적으로이를 해결하기 위해 클래스 생성자에 IInventService 매개 변수를 사용하여 단위 테스트에서 mock 객체를 전달할 수 있습니다. 그러나 나는이 클래스 생성자에 IInventService 클래스를 매개 변수로 사용할 수 있다고 생각하지 않습니다. 왜냐하면 클래스에이 특성을 추가 할 때 해당 매개 변수를 전달해야한다고 생각하기 때문입니다.

이 코드를 더 테스트 할 수있는 방법이 있습니까? 그렇지 않다면 이것에 접근하는 더 좋은 방법이 있습니까?

답변

9

ASP.NET MVC에서 DependencyResolver 클래스를 사용해야합니다. 컨테이너를 올바르게 연결하면 DependencyResolver.Current은 컨테이너를 사용하여 종속성을 해결합니다. 클래스 테스트에서

public class MustBeValidWarehouse : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     if (value is string) 
     { 
      string warehouse = value.ToString(); 
      IInventService inventserv = DependencyResolver.Current.GetService<IInventService>(); 
      return (inventserv.GetWarehouses().Where(m => m.WarehouseId == warehouse).Count() != 0); 
     } 
     return false; 
    } 
} 

는이 같은 DepedencyResolver.Current에 대한 모의를 제공 할 수

DependencyResolver.SetResolver(resolverMock); 
+0

큰 일했다, 감사합니다. –

관련 문제