4

我正在使用 asp.net MVC 2 和 Ninject 2。

设置非常简单。控制器调用调用存储库的服务。

在我的控制器中,我使用注入毫无问题地实例化服务类。但是服务类不实例化存储库,给我 NullReferenceException。

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

这行得通。但这并不...

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

当我尝试在 RoundService 类中使用 roundRepository 时给出 NullReferenceException。

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

模块类 -

public class ServiceModule : NinjectModule
{
    public override void Load( )
    {
        Bind<IRoundService>( ).To<RoundService>( ).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( )  );
}
4

1 回答 1

2

抱歉,我无法回答为什么这不能正常工作,但是您是否考虑过使用构造函数注入?

这就是我使用 Ninject 2 和 ASP.NET MVC 2 进行依赖注入的方式,它从控制器 -> 服务 -> 存储库及以后的整个链中一直工作。

对我来说,在对象的构造函数中拥有依赖项也很有意义。它使这些依赖关系对于必须实例化它的任何其他对象高度可见和明显。否则你可能会得到空引用异常......有点像你在这里。

HTH,
查尔斯

编辑:通过构造函数显示基类注入以响应评论。

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;
    }
}

这只是我做事的方式......其他人可能有不同的想法/意见。

于 2010-04-05T05:20:41.827 回答