Зачем мне нужно инициировать объект DBContext внутри конструктора класса Controller и внутри конструктора класса Repository

Я читаю следующий учебник об Asp.net MVC + Entity Framework:-

ссылка на сайт

и я обнаружил, что автор инициирует объект DbContext внутри конструктора класса репозитория следующим образом:

public class StudentRepository : IStudentRepository, IDisposable
    {
        private SchoolContext context;

        public StudentRepository(SchoolContext context)
        {
            this.context = context;
        }
    }

а также автор будет инициировать объект DBContext внутри конструктора класса Controller следующим образом:

 public class StudentController : Controller
   {
      private IStudentRepository studentRepository;

      public StudentController()
      {
         this.studentRepository = new StudentRepository(new SchoolContext());
      }

      public StudentController(IStudentRepository studentRepository)
      {
         this.studentRepository = studentRepository;
      }

      //

Первый вопрос Может кто-нибудь посоветовать, какова цель инициирования объекта DBContext внутри конструктора классов репозитория и контроллера? Я имею в виду, я могу заменить хранилище следующим образом:

public class StudentRepository : IStudentRepository, IDisposable
    {
        private SchoolContext context = new SchcooleContext
//No need for this constructor !!!
      //  public StudentRepository(SchoolContext context)
     //   {
     //       this.context = context;
      //  }

и сохранить класс контроллера как есть...

Второй вопрос Должен ли я явно упомянуть, что хранилище реализует IDisposable следующим образом:

public class StudentRepository : IStudentRepository, IDisposable

теперь, если я удаляю IDisposable, код должен работать хорошо... так какова цель явной реализации IDisposable внутри класса Repository? Я имею в виду, поскольку я буду вызывать метод StudentRepository.Dispose() из самого класса Controller, а базовый класс Controller по умолчанию реализует объект Idisposable. Так есть ли веская причина для явной реализации объекта IDisposable внутри StudentRepository?

1 ответ

Чтобы ответить на ваши вопросы:

Может кто-нибудь посоветовать, какова цель инициирования объекта DBContext внутри конструктора классов репозитория и контроллера?

Практика передачи зависимостей в конструкторе нужным им классам называется Dependency Injection. Обычно считается хорошей практикой и имеет большие преимущества.

На самом деле, он не так! Если вы заметили, StudentRepository просто принимает SchoolContext, Он никогда ничего не создает. Это означает, что StudentRepository счастлив брать любой класс, который происходит от SchoolContext и он может делать свою работу. Обычный вариант использования: при производстве вы передадите его реальную вещь, при тестировании вы можете передать его Mock SchoolContext который никогда не сохраняет в базу данных, но может быть просто в списке памяти.

Вы заметите в StudentController у него есть 1 конструктор, который занимает IStudentRepository, Это следует так же, как указано выше. Любой ол IStudentRepository Сделаю. Тем не менее, вы также заметили конструктор, который создает экземпляры обоих классов new StudentRepository(new SchoolContext());, На самом деле это называется Poor Mans Dependency Injection, Это ярлык. В реальном мире вы обычно видите что-то в каком-то файле конфигурации запуска, который говорит: когда классу нужно IStudentRepository дай это new StudentRepository(new SchoolContext()),

Должен ли я явно упомянуть, что хранилище реализует IDisposable следующим образом:

IDisposable

Да. DbContext инвентарь IDisposableи так все, что оборачивает это должно также. Идея в том, что когда вы закончите с DbConext это должно быть закрыто. IDisposable сообщает это. Обычно он используется для "неуправляемых ресурсов", таких как файлы и соединения, которые необходимо "освободить".

Другие вопросы по тегам