我正在阅读以下关于asp.net mvc + Entity框架的教程: -
我发现作者在存储库类的构造函数中启动了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对象?
答案 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如下: -
是。 DbContext
实现了IDisposable
,所以包装它的任何东西都应该如此。我们的想法是,当你完成DbConext
时,需要关闭它。 IDisposable
传达了这一点。它通常用于"非托管资源"例如需要"发布的文件和连接"。