2010-04-04 4 views
2

난 asp.net MVC 2와 Ninject 2를 사용하고있다.Ninject giving NullReferenceException

설치가 매우 간단하다. 컨트롤러는 저장소를 호출하는 서비스를 호출합니다.

제 컨트롤러에서 inject를 사용하여 문제없이 서비스 클래스를 인스턴스화합니다. 하지만 서비스 클래스는 리포지토리를 인스턴스화하지 않아 NullReferenceException을 제공합니다.

public class BaseController : Controller 
{ 
    [Inject] 
    public IRoundService roundService { get; set; } 
} 

이것은 작동합니다. 그러나 이것은 내가 내 RoundService 클래스의 roundRepository를 사용하려고하면

public class BaseService 
{ 
    [Inject] 
    public IRoundRepository roundRepository { get; set; } 
} 

은, NullReferenceException이주기 ...하지 않습니다.

IList<Round> rounds = roundRepository.GetRounds(); 

모듈 클래스 ... 공용 클래스 ServiceModule : NinjectModule { 공공 재정의 무효로드() { 바인딩() .TO() .InRequestScope(); } }

protected override IKernel CreateKernel() 
{ 
     return new StandardKernel(new ServiceModule(), 
      new RepositoryModule() ); 
} 

답변

2

죄송합니다 global.axax.cs에서

public class RepositoryModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IRoundRepository>().To<RoundRepository>().InRequestScope(); 
    } 
} 

, 그게 정상적으로 작동하지 왜 내가 대답 할 수없는하지만 당신은 생성자 주입을 사용하는 방법에 대한 생각?

Ninject 2 & ASP.NET MVC 2를 사용하여 종속성 삽입을 수행하는 방법은 컨트롤러 -> 서비스 -> 저장소 & 이상의 체인에서 작동합니다.

개체의 생성자에 종속성을 갖는 것도 나에게 의미가 있습니다. 이러한 종속성을 인스턴스화해야하는 다른 개체에 대해 매우 눈에 잘 띄고 분명하게 만듭니다. 그렇지 않으면 당신은 null 참조 예외로 끝날 수도 있습니다 ... 당신이 여기있는 것처럼.

HTHs,
찰스

편집 : 코멘트에 대한 응답으로 생성자를 통해 기본 클래스 분사를 표시합니다.

public class BaseService 
{ 
    public IRoundRepository RoundRepo { get; private set; } 

    public BaseService(IRoundRepository roundRepo) 
    { 
     RoundRepo = roundRepo; 
    } 
} 

public class SquareService : BaseService 
{ 
    public ISquareRepository SquareRepo { get; private set; } 

    public SquareService(ISquareRepository squareRepo, IRoundRepository roundRepo) 
     : base(roundRepo) 
    { 
     SquareRepo = squareRepo; 
    } 
} 

이것은 일을하는 나의 방식 일뿐입니다. 다른 사람이 다른 생각이나 의견을 가지고있을 수 있습니다.

+0

기본 클래스가 아닌 기본 서비스 클래스에 생성자 삽입을 넣으면 효과가 있습니다. 기본 클래스에있는 매개 변수가있는 생성자가 기본 매개 변수가없는 매개 변수가없는 호출 된 적이 없기 때문입니다. 저는이 모든 IOC/DI에 익숙하지 않지만 새로운 방식으로 사물에 대해 생각하게합니다. – Iceman

+1

기본 클래스에 종속성이있는 경우 매개 변수가없는 생성자가 없기 때문에 다시 종속성을 숨길 수 있습니다. 오히려 파생 클래스가 올바른 생성자를 호출하도록하십시오. 예를 들어 답을 편집하겠습니다. – Charlino

관련 문제