Mik*_*rks 0 model-view-controller asp.net-mvc entity-framework separation-of-concerns
开箱即用,当您使用Entity Framework在MVC中创建控制器时,您将获得基本的Get语句,将数据拉入控制器以显示在视图中.例如:
public ActionResult Index()
{
var capsules = db.capsules.ToList();
return View(capsules);
}
Run Code Online (Sandbox Code Playgroud)
我理解它的方式,编写MVC代码的最佳方法是将您的数据特定逻辑放在Models项目中.然后,控制器在您拥有逻辑的任何模型类中调用该方法,检索数据,然后将其发送到视图.上面的例子只是简单地检索一个非常基本的胶囊列表.我没有创建一个特殊的"CapsuleModelContext"类来处理胶囊检索操作,因为它是在我的edmx文件中处理的.
我想这一切都归结为我是否应该在Controller或Model的上下文类中实例化dbContext的问题.开箱即用,dbContext在Controller中实例化.这里有关于最佳实践的建议吗?
请区分您的域模型和视图模型.您的视图模型不负责持久化数据.您的视图模型仅作为传递到视图和从视图传递的实体的容器存在.很简单,它们是视图的模型 - 而不是视图旨在操纵的持久数据.
考虑到这一点,您应该使用控制器与您用来操纵持久数据的任何实体进行交互(无论是存储库还是 - 更直接地 - 数据库上下文).视图模型用作介质,通过该介质将视图中的数据传递给控制器,控制器又将您的字段映射到其所属的任何业务实体,并与您选择的持久性方法进行交互.视图模型和您的业务实体模型应该彼此无知.
您的视图模型应该包含的唯一逻辑(理想情况下,这应该保持最小)是逻辑,该逻辑仅对该视图模型本身是特定的.
我在一个类似的问题上发布了另一个答案,它展示了这在实践中如何运作的一个框架: