1

이 질문은 this question의 결과입니다.Ninject가 ASP.NET MVC의 사용자 정의 유효성 확인 속성에서 작동하지 않습니다

ASP.NET MVC 웹 응용 프로그램을 개발 중입니다. 내 프로젝트에서 내 뷰 모델 클래스에 데이터 주석을 사용하여 원격 유효성 검사를 수행하고 있습니다. 기본 원격 특성이 서버 유효성 검사를 지원하지 않는다는 것을 알고 있습니다. 액션 메소드에서 다시 유효성을 검사 할 수 있습니다. 그러나 나는 그것이 우려의 분리를 위반하고 있다고하고 싶지 않습니다.

그래서 사용자 지정 서버 클라이언트 원격 유효성 검사 특성을 만들려고했습니다. 온라인에서 코드를 발견하고 사용했습니다. 그러나 서버 유효성 검사가 발생하면 오류가 발생합니다. 의존성 주입을 위해 Ninject를 사용하고 있습니다. Ninject가 유효성 검사 속성에 종속성을 주입 할 수 없기 때문에 오류가 발생했습니다. 아래의 시나리오를 참조하십시오.

이 내 사용자 지정 원격 유효성 검사 속성입니다 :

public class RemoteClientServerAttribute : RemoteAttribute 
    { 
     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      // Get the controller using reflection 
      Type controller = Assembly.GetExecutingAssembly().GetTypes() 
       .FirstOrDefault(type => type.Name.ToLower() == string.Format("{0}Controller", 
        this.RouteData["controller"].ToString()).ToLower()); 
      if (controller != null) 
      { 
       // Get the action method that has validation logic 
       MethodInfo action = controller.GetMethods() 
        .FirstOrDefault(method => method.Name.ToLower() == 
         this.RouteData["action"].ToString().ToLower()); 
       if (action != null) 
       { 
        // Create an instance of the controller class 
        object instance = Activator.CreateInstance(controller); 
        // Invoke the action method that has validation logic 
        object response = action.Invoke(instance, new object[] { value }); 
        if (response is JsonResult) 
        { 
         object jsonData = ((JsonResult)response).Data; 
         if (jsonData is bool) 
         { 
          return (bool)jsonData ? ValidationResult.Success : 
           new ValidationResult(this.ErrorMessage); 
         } 
        } 
       } 
      } 

      return ValidationResult.Success; 
      // If you want the validation to fail, create an instance of ValidationResult 
      // return new ValidationResult(base.ErrorMessageString); 
     } 

     public RemoteClientServerAttribute(string routeName) 
      : base(routeName) 
     { 
     } 

     public RemoteClientServerAttribute(string action, string controller) 
      : base(action, controller) 
     { 
     } 

     public RemoteClientServerAttribute(string action, string controller, 
      string areaName) 
      : base(action, controller, areaName) 
     { 
     } 
    } 

유효성 검사가 클라이언트 측을 통과하고 서버 측에 와서
public class CategoryController : Controller 
    { 
     private ICategoryRepo categoryRepo; 

     public CategoryController() 
     { 

     } 

     public CategoryController(ICategoryRepo categoryParam) 
     { 
      this.categoryRepo = categoryParam; 
     } 
     . 
     . 
     //remote validation action 
     public JsonResult IsNameUnique(string Name) 
     { 
      IEnumerable<Category> categories = categoryRepo.Categories.Where(x => x.Name.Trim() == Name); 

      Category category = categories.FirstOrDefault(); 
      return Json(category==null, JsonRequestBehavior.AllowGet); 
     } 
} 

, 그것은 오류를 던지고 시작이 내 컨트롤러 클래스된다.

오류를입니다

enter image description here

예, 그것이 매개 변수없이 생성자를 찾을 수 없기 때문에 어떤 방법이 예외를 발견 던지고있다.

나는이

public CategoryController() 
     { 
      categoryRepo = new CategoryRepo(); 
     } 

같은 매개 변수가없는 생성자를 추가하지만 내가 Ninject에를 사용하고있는 이유는 전혀 이해가되지 않습니다, 그렇게 할 경우 문제입니다. 그것은 의존성을 만들고 있습니다. 하지만이 방법으로하지 않으면 categoryRepo는 IsNameUnique 액션에서 null 예외를 throw합니다. 그렇다면 맞춤 원격 유효성 검사 속성에서 Ninject를 어떻게 작동시킬 수 있습니까?

+0

Activator.CreateInstance를 사용하여 컨트롤러를 만드는 대신 NInject에게 제공하도록 요청할 수 있습니까? NInject에 대해 충분히 알지 못합니다. –

답변

1

봅니다 대체 :

object instance = Activator.CreateInstance(controller); 

object instance = DependencyResolver.Current.GetService(controller); 

와 나는이 논쟁 ServiceLocator 패턴의 사용이다 가리켜 야합니다. 그러나 나는이 속성에서 다르게 수행하는 방법을 거의 볼 수 없습니다.

+0

필터는 어떻습니까? 필터의 생성자에서 속성보다 DI를 설정하는 것이 더 쉽다고 생각하며,이 경우 동일한 결과를 얻을 수 있습니다. – Max

+0

감사합니다. 그것은 완벽하게 작동합니다. 도움을 주셔서 감사합니다. –