2010-04-29 7 views
3

유효성 검사를 수행하기 위해 데이터베이스를 조회해야하는 곳에서 유효성 검사 속성을 설정했습니다. 나는 프로젝트의 다른 곳에서와 같은 방식으로 속성 주입을 시도했지만 작동하지 않습니다. 어떤 단계가 빠졌습니까? 지적하는MVC의 ValidationAttribute에 대한 Ninject에서 속성 주입을 어떻게 얻습니까?

public class ApplicationIDValidAttribute : ValidationAttribute 
{ 
    [Inject] 
    protected IRepository<MyType> MyRepo; 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
     return true; 

     int id; 
     if (!Int32.TryParse(value.ToString(), out id)) 
     return false; 

     // MyRepo is null here and is never injected 
     var obj= MyRepo.LoadById(id); 
     return (obj!= null); 
    } 

또 한가지, 내가 아닌 공용 속성을 주입하기 위해 설정 한 Ninject에 커널을 가지고, 그래서 그게 문제라고 생각하지 않습니다. Ninject 2, MVC 2 및 MVC 2 버전의 Ninject.Web.MVC를 사용하고 있습니다.

감사합니다.

답변

2

Ninject에의 author하여이 post에 따르면

필드 주입 :는 함께 필드 값을 설정하는 방법이 없다 Ninject에 2의 사출 이제 .NET 3.5 표현 트리에 의해 구동되고, 되고 식 트리. 어쨌든 이것은 나쁜 습관이므로, 나는 그것을 자르기로 결정했습니다.

두 번째로 MVC2에서 기본적으로 속성은 Inversion of Control Container를 통해 생성되지 않기 때문에 Ninject가 필드 주입을 지원하더라도 여전히 작동하지 않습니다.

하나의 간단한 해결책은 다음과 같이 당신의 속성 생성자에서 ServiceLocator를 사용하는 것입니다 :

public ApplicationIDValidAttribute() 
{ 
    MyRepo = ServiceLocator.Current.GetInstance<IRepository<MyType>>(); 
} 

당신이 codeplex에 대한 정보를 찾을 수 있습니다 서비스 로케이터에 익숙하지 않은 경우. 서비스 로케이터의 사용을 암시하지 않는 두 번째 조금 더 어려운 접근법은 here으로 설명됩니다.

+0

감사합니다. 서비스 위치 정보가 도움이 될 것 같습니다. – jaltiere

1

내가 방금

그냥이 당신의 코드를 변경하고 작업을해야 당신의 repo 회원, Ninject에 지원 속성 주입에 getter와 setter를 필요가 있다고 생각합니다.

[Inject] 
public IRepository<MyType> MyRepo{ 
    get; set; 
} 
관련 문제