현재 작업중인 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 클래스를 매개 변수로 사용할 수 있다고 생각하지 않습니다. 왜냐하면 클래스에이 특성을 추가 할 때 해당 매개 변수를 전달해야한다고 생각하기 때문입니다.
이 코드를 더 테스트 할 수있는 방법이 있습니까? 그렇지 않다면 이것에 접근하는 더 좋은 방법이 있습니까?
큰 일했다, 감사합니다. –