【问题标题】:What is the standard I should use in MVC coding我应该在 MVC 编码中使用什么标准
【发布时间】:2015-10-22 21:58:01
【问题描述】:

根据here 提到的答案,我知道我应该将业务逻辑放在模型本身中,而在我的程序中,我直接在控制器的操作中使用 EF,例如从直接数据库我正在做以下事情:

public ActionResult CarList()
{
    using(var _db = new CarRentEntities())
    {
         var result = _db.Cars.Where(m=>m.Active);
         return View(result);
    }
}

如果我在控制器或模型中使用上述代码,对我的网站性能有什么影响?

我应该使用哪种方法?例如,如果我想与一个团队合作,是否有我应该遵循的标准来分隔代码,请指教

对于使用存储库模式:我读到我们不应该使用如果提到的例子 here ,我将复制一些提到的内容:

不将存储库模式与实体一起使用的唯一最佳理由 框架?实体框架已经实现了存储库模式。 DbContext 是您的 UoW(工作单元),每个 DbSet 都是存储库。 在此之上实现另一层不仅是多余的,而且 使维护更加困难。

如果我的数据库包含以下表格:ManufacturersCarsRentClients,则租金等级为在 Clients 和 Cars 之间具有 2 个外键并包含其他详细字段的表。

如何处理需要从 2 个不同的存储库 Cars 和 Clients 获取数据以根据用户输入的搜索条件显示租赁网格的 Rent 对象,如果我将使用存储库 Cars 和 Clients ,它们有自己的自己的 dbContext,BOOM我的脑袋看不懂这个技巧,请指教

【问题讨论】:

  • 这基本上是一个分层的关注点。这实际上与性能无关,而与可维护性有关。你的情况:如果你的数据层发生变化,你的 ui 层可能会出现问题。除此之外:将所有数据从数据层发送到 ui 可能会导致安全问题。您可能正在某处使用隐藏字段作为 ID,可以非常轻松地对其进行操作 ;-)
  • 你可以阅读这篇关于工厂模式的文章,在下面的答案中提到:oodesign.com/factory-pattern.html,只需创建一个层,你将放置所有将使用 EF 和模型作为容器的方法,并且很容易您可以按照@PhilipH 提到的内容进行操作,这样,您的模型将保持干净,您的控制器将变薄,您的代码将更易于维护

标签: c# entity-framework model-view-controller


【解决方案1】:

通常模型是一个“单元”——即它是您要显示的数据的模型。控制器是一个“集成器” - 即它将呈现网页所需的各种资源汇集在一起​​​​。您可能希望创建一个执行类似操作的数据库门面类;

public ActionResult CarList()
{
    using(var carStore = new Factory.CreateCarStore())
    {
         var result = carStore.GetActiveCars();
         return View(result);
    }
}

将您的数据库访问与您的 Web 控制器分开(这也将使其更具可测试性,因为您可以替换不同的 CarStore 实现(即测试 XML 数据集)用于测试目的。

【讨论】:

【解决方案2】:

您的问题的答案是,它不会真正影响性能,但随着应用程序变得越来越大,它肯定会成为可维护性方面的问题。您可以采用 SOLID 架构原则:SOLID architecture principles using simple C# examples。这使您能够开发高质量的软件。

您可以创建多层应用程序:

  1. 接口层 - MVC 应用程序
  2. 业务层 - 具有逻辑类的类库
  3. 数据访问层 - 数据库上下文和存储库,CRUD 操作的工作单元
  4. 共享层 - 日志记录、AppSettings、验证、实用程序、扩展、常量、枚举

让您的应用程序采用这种结构,您需要考虑控制反转、依赖注入等诸多因素,以确保松散耦合的类、简单的单元测试以及最重要的是一个可靠的应用程序。

您也可以阅读:Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application

【讨论】:

  • 我现在正在看SOLID的文章,关于repository,我看了一些建议不要使用repository的文章,有些想法说EF已经是repository结构了,所以如果我们要建一个存储库,然后我们使我们的代码复杂化
  • 这仅适用于 EF,但您可以找到需要将其删除以使用 ADO.NET 的位置。现在你会怎么做?
  • #user5135401 我同意 EF 是一个存储库实现,但它的开放性使其不能再用作通用存储库。显然,实现平面文件或内存 XML 存储并让 EF 将其用作其数据存储在技术上是可行的,但这将是一项艰巨的任务,极有可能引入缺陷。我个人不使用 EF,因为它与底层数据库过于耦合——我总是使用业务上下文特定的数据存储工厂+接口模式,并简单地使用 ADO.net 来调用存储过程(但您可以改用 EF)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多