2010-04-04 84 views
2

我使用asp.net MVC 2和Ninject 2.Ninject給NullReferenceException

設置非常簡單。 控制器調用調用存儲庫的服務。

在我的控制器中,我使用注入來實例化服務類沒有問題。但是服務類不會實例化這些存儲庫,給我NullReferenceException。

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

This Works。但隨後這個不...

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

給予一個NullReferenceException,當我嘗試使用roundRepository我RoundService類。

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

模塊類... 公共類ServiceModule:NinjectModule { 公共覆蓋無效負載() { 綁定()。爲了().InRequestScope(); }}

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

在global.axax.cs

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

回答

2

對不起,我不能回答爲什麼不工作應該的方式,但你有沒有想過使用構造器注入?

這就是我如何做我的依賴注入與Ninject 2 & ASP.NET MVC 2,它一直沿着從控制器 - >服務 - >存儲庫&超越。

對於我來說,在對象的構造函數中擁有依賴關係也是有意義的。它使得這些依賴關係對於任何其他需要實例化的對象都是高度可見和明顯的。否則,你可能會得到空引用異常...有點像你在這裏。

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 2010-04-05 11:08:49

+1

如果你的基類有一個依賴項,那麼我就不會有一個無參數的構造函數,因爲你再次隱藏了依賴項。而是讓你的派生類調用正確的構造函數。我會編輯我的答案來舉個例子。 – Charlino 2010-04-05 21:15:15