【问题标题】:Rewriting a legacy-proprietary Web Application to MVC3/Entity-Code-First将遗留的专有 Web 应用程序重写为 MVC3/实体代码优先
【发布时间】:2011-06-17 22:26:36
【问题描述】:

几个月来,我发布了一些关于 ASP.NET 应用程序和数据库抽象层的结构的问题,目的是为了重写(从头开始)旧版 Web 应用程序。我最近偶然发现了 MVC3/Entity-Code-First,在花了一些时间使用它之后,我爱上了它的工作原理,事物是如何抽象出来的,我正在寻找任何使用它的借口!

遗留应用程序是一个 C++/CLI windows 服务,它生成它自己的 HTML(非常老式的 HTML,CSS 仅用于颜色和表格),并且界面与业务逻辑紧密耦合。基本上,任何事情都会有所改进。

但是,也许这是因为我还没有花足够的时间在 MVC 上,我有一些挥之不去的疑问,想知道你们中的一些 MVC 专业人士是否可以将他们的经验转向我的方向。

  • 旧版应用程序使用自定义控件(它自己的形式)将组合框绑定到数据,并根据另一个组合框的选择动态重新填充相关的组合框。在 ASP.NET 中,这个问题很容易回答,因为只需在页面上抛出一个 asp:DataList 控件,将其绑定到数据源,瞧。一些简单的代码允许您然后过滤所选值的其他组合框。在 ASP.NET 中也很容易实现另一个数据列表,甚至以这种方式自动化依赖数据(这将很好地模仿遗留应用程序的行为)。我似乎无法在 MVC 中找到自定义控件的概念,尽管我假设这种东西是由 jQuery 调用处理的,以获取数据并将其放入组合框中。但这是否适用于每个页面上的每个组合框?这是传递适当参数的局部视图的情况,还是这只是愚蠢的?

  • 我猜这与实体框架的关系比 MVC 更多,但我在网上找到的大多数示例和教程都执行 LINQ 查询以返回要显示的对象集合,例如来自 MvcMovie 示例的 this :

    public ActionResult Index()
    {
        var movies = from m in db.Movies
                     where m.ReleaseDate > new DateTime(1984, 6, 1)
                     select m;
    
        return View(movies.ToList());
    }
    

    然后在视图中使用@foreach 循环进行渲染。这一切都很棒。遗留应用程序有一个浏览页面,供系统的所有其他区域使用(超过 50 个)。它通过检查为登录用户定义的列顺序、展平任何外键(以便显示外表上的字段而不是非用户友好的主键值)来做到这一点,并且还允许用户应用自定义过滤器到任何列。它也适用于行数超过 100k 的表。如何使用实体框架和视图编写类似的东西?在 ASP.NET 中,我可能会通过动态生成某种网格视图并让它自动生成列并应用过滤器来解决这个问题。这似乎让我在 MVC 中工作更多。我错过了什么?

  • 旧版应用程序具有多个操作大型数据集的操作。现在因为它是一项服务,它可以启动这些线程而不必担心被关闭。我在 SO 上的一个问题是关于静态管理器的存在以及 AppPool 回收的引入,但我认为拥有辅助服务是一个不错的选择。也就是说,旧版应用程序将更新语句应用于大型记录组而不是单行。 Entity-Framework 是否可以在不针对绕过正常模型的数据库编写自定义 SQL 的情况下实现这一点?我希望我不必做这样的事情(不是我愿意,这只是举例)

    var records = from rec in myTable
                  where someField = someValue
                  select rec;
    foreach(rec in records)
        rec.applyCalculation();
    db.SaveDbChanges();
    

    我怀疑这可能需要很多时间,而旧版应用程序会这样做:

    UPDATE myTable
    SET field1 = calc
    WHERE someField = someValue
    

    所以我并不完全清楚我们如何以这种方式使用我们的模型。

  • 旧版应用程序的布局中有一些数据面板,可以在您所在的任何页面上显示。在 Stackoverflow 上查看这里,我发现 this 问题,这意味着 每个 视图都需要将此信息传递给布局?是这样,还是有更好的方法?理想情况下,我希望我的布局能够访问特定的模型/存储库并在侧面板中显示数据。添加到每个视图页面可能会非常重复并且容易出错。更不用说如果我需要修改某些东西需要花费的时间。局部视图可以在这里使用,但我再次不确定如何在布局页面上将模型传递给它。

  • 最后,我很失望,在安装 Ef-Code-First 之后,发现一个非常好的属性,SourceName 还没有进入。这在映射遗留表/列时会非常好,我不完全确定为什么此时它被遗漏了(至少,我的智能感知器说它不存在!)有没有人知道什么时候会发生这种情况?我可以暂时不用它,但最终它会非常有用。

对于冗长的问题,我们深表歉意。经过多年对 ASP.NET 和 MVC3 的调查工作,我真的很想使用 MVC3!

【问题讨论】:

  • 阅读标题和最后一行...其他所有内容都太多了。你自己说它很长,试着把它浓缩成一个易于管理的问题。
  • 对于带有 mvc 的 jQuery 东西看这里awesome.codeplex.com

标签: c# asp.net asp.net-mvc entity-framework ef-code-first


【解决方案1】:

如果我能正确提取问题,那么这就是我的回答:

  1. 您对主-详细信息下拉菜单(或其他控件,就此而言)的想法是正确的。 jQuery AJAX/JSON 调用(主要是 GET)将是您所需要的。如果您的页面上只有一个下拉菜单,那么您当然不需要那种交互性 - 您可以在控制器操作中为其准备模型(您创建一个 SelectList 对象)。

  2. 在这里,您很可能最终会使用某种网格系统,例如 jqGrid 或 Flexigrid。他们做了大部分关于过滤/搜索/查询自己的事情。您仍然必须提供将提供数据的 JSON 控制器操作。

  3. 是的,您可以通过 EF 执行 SQL。有ExecuteStoreQuery()ExecuteStoreCommand()。这里有更多关于http://msdn.microsoft.com/en-us/library/ee358769.aspx

  4. 您可以从视图中调用RenderAction() 并让此操作按需准备数据(无论何时调用它)并渲染出部分(或普通)视图并将数据(模型)提供给它。 RenderPartial() 对此有点笨拙 - 它要求您在调用 RenderPartial() 的视图中已经有可用的模型。 RenderPartial() 永远不会返回到控制器操作 - 它只是使用您在视图中调用时提供的模型呈现模板中定义的 HTML。

  5. 很遗憾,我不知道这个问题的答案。

HTH

【讨论】:

  • 在 4. 中,您还可以选择为模型创建基类。此类将具有您希望在所有视图中可用的数据的属性。但我更喜欢 RenderAction() 。
  • 感谢您的回复,非常有帮助!
【解决方案2】:

您可能不喜欢它,但重构 c++ 应用程序可能更有意义。尤其是对业务。生成html没有错。比一组模板更容易重构为现代 html/css。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多