gpt4 book ai didi

asp.net-mvc - 没有任何 ORM 的 ASP.NET MVC 4 项目

转载 作者:行者123 更新时间:2023-12-04 20:03:24 26 4
gpt4 key购买 nike

很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center .




8年前关闭。




我试图在没有 EF 的情况下使用 ASP.NET MVC,也可能没有 LINQ。首先,我在 VS2010 中的基本 ASP.net mvc 模板上仅创建了一个表/模型/ Controller / View (仅实现了索引页面和索引方法)。我目前正在尝试/错误,因为网络上的所有教程都基于 EF,并且我有一个嵌入式 c 背景。

我的问题是:

  • 架构是否正确?
  • 我看到存储库模式用于一些开源项目,例如 Nearforums。它的优势是什么,它如何适应这一点,它是否取代了 DAL?
  • 我应该将数据表传递给 View 还是代表数据表的对象?
  • 我可以将多个模型传递给 Razor 页面吗?例如,我如何列出 2 个不同的表?
  • 将所有 DAL 代码放在一个文件中是否更好?

  • DAL:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data;
    using System.Configuration;
    using MySql.Data.MySqlClient;

    namespace MvcApplication1.Models
    {
    public class DAL
    {
    public DAL()
    { }
    public DataTable getDataTable(string tableName)
    {
    using (MySqlConnection conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["MySQLConn"].ConnectionString))
    {
    using (MySqlCommand command = conn.CreateCommand())
    {
    command.CommandText = "select * from " + tableName;
    command.CommandType = CommandType.Text;

    conn.Open();

    var table = new DataTable();
    table.Load(command.ExecuteReader());

    return table;
    }
    }
    }
    }
    }

    Product.cs 类表示代码中的 Product 表:
    namespace MvcApplication1.Models
    {
    public class Product
    {
    public int ProductId { get; set; }
    public string Name { get; set; }
    public string Producer { get; set; }
    public int UnitPrice { get; set; }
    }
    }

    ProductController.cs
    namespace MvcApplication1.Controllers
    {
    public class ProductController : Controller
    {
    //
    // GET: /Product/
    DAL dal = new DAL();
    public ActionResult Index()
    {
    DataTable dt = dal.getDataTable("Product");
    Product[] products = new Product[dt.Rows.Count];
    for (int i = 0; i < dt.Rows.Count; i++)
    {
    products[i] = new Product();
    products[i].ProductId = (int)dt.Rows[i]["ProductId"];
    products[i].Name = (string)dt.Rows[i]["Name"];
    products[i].Producer = (string)dt.Rows[i]["Producer"];
    products[i].UnitPrice = Decimal.ToInt32((decimal)dt.Rows[i]["UnitPrice"]);
    }

    return View(products);
    }
    ........
    ........
    }

    索引.cshtml:
    @model IEnumerable<MvcApplication1.Models.Product>
    @{
    ViewBag.Title = "Index";
    }

    <h2>Index</h2>
    @foreach (var item in Model)
    {
    <tr>
    <td>
    @Html.DisplayFor(modelItem => item.ProductId)
    </td>
    <td>
    @Html.DisplayFor(modelItem => item.Name)
    </td>
    <td>
    @Html.DisplayFor(modelItem => item.Producer)
    </td>
    <td>
    @Html.DisplayFor(modelItem => item.UnitPrice)
    </td>
    <td>
    @Html.ActionLink("Edit", "Edit", new { id=item.ProductId }) |
    @Html.ActionLink("Details", "Details", new { id=item.ProductId }) |
    @Html.ActionLink("Delete", "Delete", new { id=item.ProductId })
    </td>
    <br>
    </tr>
    }

    最佳答案

    我看到存储库模式用于一些开源项目,例如 Nearforums。它的优势是什么,它如何适应这一点,它是否取代了 DAL?

    存储库模式的好处是它允许您切换数据访问逻辑/ORM。例如,如果您想从 Entity Framework 切换到 NHibernate,您只需更新 IoC 容器内的注册,就像魔术一样,您的代码正在使用 NHibernate,而您对切换的了解为 0。它允许您的代码与底层持久性框架无关。据它所知,结果代码来自文件、Web 服务调用或内存列表。如果您必须从另一个组件进行相同的查询,您还将获得重用。另一个好处是单元测试。对于您当前的实现,您无法对 Controller 进行单元测试,因为它每次都会直接连接到您的数据库,因此根据定义,它是一个集成测试。您肯定希望利用 ORM,否则您将一遍又一遍地编写相同的代码,直到它让您哭泣为止。设置/拆除连接、将所有原语类型转换为原生 .NET 类型等。如今,处理原生 ADO.NET 已成为过去。让您的生活更轻松并使用 ORM。同时,能力越大责任越大。如果您不验证针对数据库生成和执行的查询,则 ORM 可能是一场噩梦。如果使用不当,它们会产生性能问题。您将能够将 LINQ 用于大多数查询,但有时您将不得不使用原始 SQL 并使用原始 SQL。您的 ORM 仍然能够处理这两种情况。

    我应该将数据表传递给 View 还是代表数据表的对象?

    您当然不想传递数据表。您想将 View 模型或实体传递给您的 View 。 View 应该对数据库一无所知。你所做的就是给它数据,它会显示在屏幕上,但不知道该数据的来源。如果您使用的是 NHibernate 之类的东西,则在将实体直接传递到 View 时要小心,因为您会遇到与延迟加载和 N + 1 查询相关的问题。 View 模型通常是实体的精简版本。例如,如果您有一个具有 4 个属性的实体,但 View 只需要使用这些属性的 2/4,您将创建一个具有 2 个属性的单独 View 模型,并使用像 Automapper 这样的映射库从您的实体映射到 View 模型。

    我可以将多个模型传递给 Razor 页面吗?例如,我如何列出 2 个不同的表?

    这很简单。您创建一个顶级对象并为其提供 2 个属性来表示您要访问的实体。

    public class MyViewModel
    {
    public Entity1 FirstObject { get; set; }

    public Entity2 SecondObject { get; set; }
    }

    然后,您将创建一个强类型 View ,并使用您在问题中发布的 razor View 中使用的强类型 View 助手来呈现 FirstObject 和 SecondObject。 @Html.TextBoxFor() 等

    最后,您的 Controller 将接受 MyViewModel 作为参数,并根据 View 中呈现的表单输入填充 FirstObject 和 SecondObject。

    将所有 DAL 代码放在一个文件中是否更好?

    您想将相关的 DAL 代码放在同一个文件中。事物通常按表映射,但这一切都取决于对象之间的关系(例如,聚合根是什么)。您不想做的是盲目地为每个表实现一个存储库。您最终会得到一个真正的程序化和贫乏的数据模型,它会通过多次调用数据库将对象图和关系拼接在一起。我建议您研究领域驱动设计以了解如何解决这个问题。

    我只是触及了表面。如果你想正确地做这些事情,你基本上需要学习最新的模式和实践。这是一个不同的运动。不像过去的文件、 View 状态和 DataGrid 控件背后的单一代码的美好时光。那里有一些非常好的书,例如:

    棕地应用开发
    领域驱动设计 (Eric Evans)
    清洁编码器(罗伯特 C 马丁)
    重构:改进现有代码的设计(Martin Fowler)
    企业应用程序架构模式 (Martin Fowler)

    我并不是说要逐字阅读所有这些书,但我强烈推荐前 2 本书。我相信社区会对这些开发实践有更多的话要说,但这是我对这一切的看法。谢谢,祝你好运。

    关于asp.net-mvc - 没有任何 ORM 的 ASP.NET MVC 4 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14407256/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com