0

开箱即用,当您使用 Entity Framework 在 MVC 中创建控制器时,您将获得将数据拉入控制器以显示到视图中的基本 Get 语句。例如:

    public ActionResult Index()
    {
        var capsules = db.capsules.ToList();
        return View(capsules);
    }

我理解它的方式,编写 MVC 代码的最佳方式是将您的数据特定逻辑放入模型项目中。然后,控制器在您拥有逻辑的任何模型类中调用该方法,检索数据,然后将其发送到视图。上面的例子只是简单地检索一个胶囊列表——非常基本。我没有创建一个特殊的“CapsuleModelContext”类来处理胶囊检索操作,因为它正在我的 edmx 文件中处理。

我想这一切都归结为我是否应该在控制器或模型的上下文类中实例化 dbContext 的问题。开箱即用,dbContext 在控制器内部实例化。对这里的最佳实践有什么建议吗?

4

1 回答 1

5

请区分您的领域模型视图模型。您的视图模型不负责持久化数据。您的视图模型只是作为实体的容器存在,这些实体可以传入和传出您的视图。很简单,它们是视图的模型——而不是视图旨在操作的持久数据。

考虑到这一点,您应该使用控制器与您用来操作持久数据的任何实体进行交互(无论是存储库还是 - 更直接地 - 数据库上下文)。视图模型用作将数据从视图传递到控制器的媒介,控制器又将字段映射到它所属的任何业务实体,并与您选择的持久性方法进行交互。视图模型和您的业务实体模型应该相互不了解。

您的视图模型应该包含的唯一逻辑(理想情况下应该保持在最低限度)是显然只特定于该视图模型本身的逻辑。

我发布了对类似问题的另一个答案,它展示了它在实践中的工作原理:

TextBoxFor() 不生成验证标记

于 2013-02-03T22:03:40.040 回答