Зачем мне нужно инициировать объект 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 следующим образом:
Да. DbContext
инвентарь IDisposable
и так все, что оборачивает это должно также. Идея в том, что когда вы закончите с DbConext
это должно быть закрыто. IDisposable
сообщает это. Обычно он используется для "неуправляемых ресурсов", таких как файлы и соединения, которые необходимо "освободить".