Привязать репозиторий к базовому классу только через Ninject? - PullRequest
1 голос
/ 20 января 2012

У меня есть базовый класс, в который репозиторий вставлен в конструктор, теперь любому классу, который я извлекаю из него, теперь также нужны эти параметры, но репозиторий используется только базовым классом, есть ли способ связать Ninject просто базовый класс и не пройти через конструктор? И самое главное, это хорошая идея?

public class HtmlPageModel
{

        private readonly IHtmlPageRepository _repository;

        public HtmlPageModel (IHtmlPageRepository repository)
        {
            _repository = repository;

        }
}


public class VideoPageViewModel : HtmlPageModel 
{

        public VideoPageViewModel(IHtmlPageRepository repository) : base(repository)
        {

        }
    }

Ответы [ 3 ]

4 голосов
/ 20 января 2012

Просмотр моделей вообще не должен иметь зависимостей. Вставьте репозиторий в контроллер и присвойте ему значения.

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

2 голосов
/ 20 января 2012

Я до сих пор придерживаюсь моего предыдущего комментария: вы должны переосмыслить иерархию классов, это не то, с чем вам нужно работать в Ninject.

Если ваш базовый класс принимает репозиторий, то все ваши производныеклассы.Однако в качестве альтернативы вы можете добавить NullRepository в ваш VideoPageViewModel, который в принципе ничего не делает (см. Шаблон нулевого объекта )

Привязка по типу цели может быть достигнута с помощью WhenInjectedInto()в Ninject:

kernel.Bind<IHtmlPageRepository>()
      .To<HtmlPageRepository>()
      .WhenInjectedInto<HtmlPageModel>();

kernel.Bind<IHtmlPageRepository>()
      .To<NullRepository>()
      .WhenInjectedInto<VideoPageViewModel>();
0 голосов
/ 20 января 2012

Это в основном тот же ответ, что и brokenGlass.Почему бы просто не создать другой базовый класс и переместить атрибуты / функциональные возможности из текущего базового класса в этот, но не перемещать конструктор / функциональные возможности, относящиеся к хранилищу.

...