几个月来,我发布了一些关于 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 示例:
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 上查看这里,我发现了这个问题,这意味着每个视图都需要将这些信息传递给布局?是这样,还是有更好的方法?理想情况下,我希望我的布局能够访问特定的模型/存储库并在侧面板中显示数据。添加到每个视图页面可能会非常重复并且容易出错。更不用说如果我需要修改某些东西需要花费的时间。局部视图可以在这里做,但我再次不确定如何在布局页面上将模型传递给它。
最后,我很失望,在安装了 Ef-Code-First 之后,发现一个非常好的属性,
SourceName
还没有进入。这在映射遗留表/列时会非常好,我不完全确定为什么此时它被遗漏了(至少,我的智能感知器说它不存在!)有没有人知道什么时候会发生这种情况?我可以暂时不用它,但最终它会非常有用。
对不起,冗长的问题。经过多年对 ASP.NET 和 MVC3 的调查工作,我真的很想使用 MVC3!