为什么我需要在Controller类构造函数中启动DBContext对象&在Repository类构造函数

时间:2016-03-30 02:35:20

标签: c# asp.net asp.net-mvc entity-framework dbcontext

我正在阅读以下关于asp.net mvc + Entity框架的教程: -

link

我发现作者在存储库类的构造函数中启动了DbContext对象,如下所示: -

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

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

并且作者将在Controller类构造函数中启动DBContext对象,如下所示: -

 public class StudentController : Controller
   {
      private IStudentRepository studentRepository;

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

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

      //

第一个问题。任何人都可以建议在Repository&amp ;;内部启动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,代码应该运行良好..那么在Repository类中显式实现IDisposable的目的是什么?我的意思是因为我将从Controller类本身调用StudentRepository.Dispose()方法,并且默认情况下基本Controller类实现Idisposable对象..那么有没有合理的理由在StudentRepository中显式实现IDisposable对象?

1 个答案:

答案 0 :(得分:1)

回答你的问题:

  

任何人都可以建议启动DBContext的目的是什么   存储库中的对象&控制器类构造函数?

将构造函数中的依赖项传递给需要它们的类的做法称为Dependency Injection。它通常被认为是良好的做法,具有很大的优势。

实际上,他不是!如果您注意到,StudentRepository只接受SchoolContext。它永远不会实例化任何东西。这意味着StudentRepository很乐意接受任何来自SchoolContext的课程并且可以完成其工作。一个常见的用例是,在生产中你会传递它真实的东西,在测试中你可以传递一个Mock SchoolContext,它永远不会保存到数据库,但可能只是一个内存列表。

你会在StudentController注意到他有一个构造函数,它带有IStudentRepository。这与以上相同。任何ol' IStudentRepository会这样做。但是,您还注意到一个实例化两个类new StudentRepository(new SchoolContext());的构造函数。这实际上称为Poor Mans Dependency Injection。这是一条捷径。在现实世界中,您通常会在某些启动配置文件中看到以下内容:当某个类需要IStudentRepository时,请将其new StudentRepository(new SchoolContext())

  

我是否需要明确提到存储库实现了   IDisposable如下: -

IDisposable

是。 DbContext实现了IDisposable,所以包装它的任何东西都应该如此。我们的想法是,当你完成DbConext时,需要关闭它。 IDisposable传达了这一点。它通常用于"非托管资源"例如需要"发布的文件和连接"。