2010-04-04 39 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