2012-12-13 4 views
2

ASP.NET MVC를 사용하면 생성자 삽입에 데이터 주석 특성을 사용할 수 있습니까? 특히 유효성 검사 특성을 사용하고 있습니까? 내가 할 수 있도록하고 싶습니다 무엇데이터 주석 생성자 삽입

은 다음과 같습니다

public class NoEmailTakenAttribute : ValidationAttribute 
{ 
    public NoEmailTakenAttribute(IService service) { .. } 
} 

하는 것이 가능합니까?

감사합니다.

+0

달성하려는 목표는 무엇입니까? – Jeroen

+0

제어기 작성시 DI를 사용할 수있는 것처럼 DI 기능으로 유효성 검증 속성을 작성하십시오. –

+0

DI가 무엇을 의미하는지 알고 싶습니까? – Jeroen

답변

3

리플 렉서를 사용하여 컨트롤러 주입을 사용할 수 없지만 속성 주입을 사용할 수있는 것으로 보입니다. DataAnnotationsModelValidatorProvider을 상속받은 클래스를 만들고 GetValidators 메서드를 재정 의하여 유효성 검사가 시작되기 전에 특성을 속성에 주입 할 수 있습니다. 초기 분석에서 나온 것으로 아직 완전히 결정되지 않았습니다.

0

기본 컨트롤러 클래스를 만들고 IService 인터페이스의 속성을 선언하고 매개 변수 IService를 사용하여 기본 컨트롤러 클래스를 작성하면됩니다. 파생 된 클래스에서 이것을 사용하십시오. asp.net mvc는 기본 컨트롤러 생성자를 사용하여 파생 클래스 매개 변수화 된 생성자로 서비스가 인스턴스화되는 시간을 초기화합니다.

+0

컨트롤러 인젝션에 대해 이야기하고 있습니다. 데이터 주석 속성 삽입에 대해 이야기하고 있습니다. –

0

사용자 지정 데이터 주석에 대해 생성자 삽입이나 속성 삽입을 쉽게 수행 할 수있는 방법이 없다고 생각합니다. @ BrianMains는 그럴듯한 사운드를 제안했지만, 나는 그걸로 멀리까지 가지 않았다.

복잡성을 해결하는 한 가지 방법은 맞춤 데이터 주석에 서비스 위치 지정자를 사용하여 필요한 종속성을 얻는 것입니다. 깨끗하지는 않지만 똑같은 결과를 얻습니다.

확인 대한 추가 정보를 원하시면이 링크 아웃 : 브라이언 주 전원에 의해 제안 된 Dependency injection in custom DataAnnotations in ASP.Net MVC 3

0

이 솔루션은 잘 작동합니다. 나는 생성자 주입이 여기에 옵션이라고 생각하지 않지만 속성 주입은 그 일을 할 것입니다. 당신은 ModelValidatorProvider에서 파생 수 있으며, 구현이에 비슷한 보일 수 있습니다 : 나는 ModelMetadata에 자세히 보면 그냥 검증을 반환할지 여부를 결정하는 refelction를 사용하지만, 아마도 더 나은 수행 할 수 있습니다하지 않았다

public class MyModelValidatorProvider : ModelValidatorProvider 
{ 
    private IDiContainer _container; 

    public MyModelValidatorProvider(IDiContainer container) 
    { 
     _container = container; 
    } 

    public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context) 
    { 
     List<ModelValidator> validators = new List<ModelValidator>(); 

     PropertyInfo targetProperty = metadata.ContainerType.GetProperty(metadata.PropertyName); 
     if (targetProperty.GetCustomAttributes(false).Any(attr => attr.GetType() == typeof(NoEmailTakenAttribute))) 
     { 
      DataAnnotationsModelValidator<NoEmailTakenAttribute> validator = new DataAnnotationsModelValidator<NoEmailTakenAttribute>(
       metadata, context, _container.Resolve<NoEmailTakenAttribute>()); 

      validators.Add(validator); 
     } 

     return validators; 
    } 
} 

.

그런 다음 Global.asax에 다음을 추가합니다

ModelValidatorProviders.Providers.Add(new MyModelValidatorProvider(InstanceOfContainer)); 

하고 갈 수 있어야합니다. 여기서 유일한 문제는 기본 메커니즘을 통해 유효성 검사기가 생성된다는 것입니다. 분명히 이것은 유효성 검사기에 적절한 종속성이 주입되지 않게합니다. 유효성 검사기를 기본 작성에서 제외하는 방법을 알지 못하지만 유효성 검사기 내부에서 null 값을 제대로 검사하면 정상적으로 작동합니다 (약간의 해결 방법이 있지만 어쩌면 더 나은 방법을 찾을 수 있습니다).