ASP.NET MVC: конструкторы контроллеров - PullRequest
1 голос
/ 12 октября 2009

Я только начинаю с asp.net mvc. Это долгий путь, прежде чем вы действительно сможете получить живой проект. В данный момент я работаю над созданием блога, используя выпущенную книгу asp.net mvc.

Однако я не понимаю 2 конструкторов в BlogController (см. Вопрос ниже)

Thx ...

ПЕРВЫЙ

BlogController имеет закрытую переменную _repository

Private _repository As BlogRepositoryBase

Public MustInherit Class BlogRepositoryBase
    'blog entry methods
    Public MustOverride Function ListBlogEntries() As List(Of BlogEntry)
    Public MustOverride Sub CreateBlogEntry(ByVal BlogEntryToCreate As BlogEntry)
    Public MustOverride Function QueryBlogEntries() As IQueryable(Of BlogEntry)
End Class
  • BlogRepositoryBase наследуется EntityFrameworkBlogRepository _
  • EntityFrameworkBlogRepository соединяется с BlogDBEntities

СЛЕДУЮЩИЙ

Контроллер имеет 2 конструктора 'new' и 'new с параметром'

Public Sub New()
    Me.New(New EntityFrameworkBlogRepository())
End Sub

Public Sub New(ByVal repository As BlogRepositoryBase)
    _repository = repository
End Sub

ВОПРОСЫ

  • Что происходит с конструкторами, я не понимаю
  • Каким образом класс типа EntityFrameworkBlogRepository может быть передан в sub sub как BlogRepositoryBase? Разве это не другой тип?

Ответы [ 3 ]

3 голосов
/ 12 октября 2009

Конструктор по умолчанию вызывает конструктор с параметром с новым экземпляром определенного типа класса BlogRepositoryBase. EntityFrameworkBlogRepository должен быть производным от этого базового класса. Причина, по которой вы указываете базовый класс (я бы использовал интерфейс, но я отвлекся), заключается в том, что в ваших тестах вы можете указать другой тип репозитория, который, возможно, даже не подключается к базе данных путем создания экземпляров. это напрямую через конструктор не по умолчанию. Фреймворк всегда будет использовать конструктор по умолчанию, поэтому вы должны как предоставить его, так и обеспечить подходящую реализацию репозитория, используя его.

FWIW - это то, как я бы это сделал (в C # - мой мозг еще недостаточно хорошо работает для перевода на VB).

 protected IBlogRepository Repository { get; set; }

 public BlogController() : this( null ) {}

 public BlogController( IBlogRepository repository )
 {
      this.Repository = repository ?? new EntityFrameworkBlogRepository();
      ...
 }

Проверено как

 public void Test()
 {
      var repository = MockRepository.GenerateMock<IBlogRepository>();

      var controller = new BlogController( repository );

      ...

      repository.VerifyAllExpectations();
 }
0 голосов
/ 12 октября 2009

Кодирование пользовательских IControllerFactory или DefaultControllerFactory наследует класс.И SetControllerFactory global.asax.

Haaked становится очень референсным.

TDD и внедрение зависимостей с ASP.NET MVC

0 голосов
/ 12 октября 2009

EntityFrameworkBlogRepository является производным от BlogRepositoryBase

«Волшебство» в конструкторах называется Внедрение зависимости . (В Wiki есть кое-что об этом здесь.) Короче говоря, это способ сделать ваш код более понятным и проверяемым, передавая ему свои зависимости ... если вы меняете тип репозитория, вам не нужно вырывать большую часть кода.

Доброжелательность,

Dan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...