Ninject дает исключение NullReferenceException - PullRequest
2 голосов
/ 04 апреля 2010

Я использую asp.net MVC 2 и Ninject 2.

Настройка очень проста. Контроллер вызывает службу, которая вызывает хранилище.

В моем контроллере я использую inject для создания экземпляров классов обслуживания без проблем. Но классы обслуживания не создают экземпляры репозиториев, давая мне исключение NullReferenceException.

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

Это работает. Но тогда это не ...

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

Предоставление исключения NullReferenceException при попытке использовать roundRepository в моем классе RoundService.

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

Модуль классов ... открытый класс ServiceModule: NinjectModule { публичное переопределение void Load () { Bind () .To () .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( )  );
}

1 Ответ

2 голосов
/ 05 апреля 2010

Извините, я не могу ответить, почему это не работает так, как должно, но вы задумывались об использовании инъекции в конструктор?

Вот так я делаю инъекцию зависимостей в Ninject 2 и ASP.NET MVC 2, и она работает по всей цепочке от контроллера -> сервис -> репозиторий и далее.

Для меня также имеет смысл иметь зависимости в конструкторе для вашего объекта. Это делает эти зависимости хорошо видимыми и очевидными для любого другого объекта, который должен его создавать. В противном случае вы можете получить исключение нулевой ссылки ... вроде как здесь.

HTHS
Charles

РЕДАКТИРОВАТЬ: Показывает внедрение базового класса через конструкторы в ответ на комментарии.

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

Это просто мой способ ведения дел ... у кого-то еще может быть другая идея / мнение.

...