如何加快我的MVC4应用程序开发



我知道这听起来很奇怪-请允许我解释一下:

我目前正在开发一个带有数据库的标准web应用程序。我选择使用IoC框架(Ninject)、实体代码优先、Bootstrap和其他一些相关技术。我已经用UML转录了一个数据库模型,现在我正在尝试一步一步地实现它。通常是这样的:

  1. 选择要实现的功能
  2. 检查需要哪些数据库表
  3. 创建适当的POCO类
  4. 使用迁移工具生成新数据库
  5. 创建功能所需的所有必需的CRUD方法。(我知道我应该创建单元测试,但根本没有时间:/)

第一个问题是-以上情况对你来说"正常"吗?也许我错过了一些可以加快我发展的东西?或者,也许我应该增加一些步骤,例如,尽早发现更多错误?

现在下一步是创建视图,所以我做了这样的事情:

  1. 在适当的控制器中创建ViewMethod
  2. 基于一个或多个POCO数据库类创建ViewModel
  3. 为我的新ViewModel创建编辑器模板
  4. 在控制器内创建功能逻辑

上述方法的问题是:

  1. 我经常需要创建几乎是POCO实体的副本,然后在保存过程中,我需要将其转换回适当的POCO实体,通常如下所示:

    PocoEntity1 pocoEntity1 = new ()
    {
    UserName = ViewModel.UserName,
    UserPicture  = ViewModel.UserPicture
    (and so on)
    } 
    

以上内容非常耗时且容易出错-另一方面,如果我直接使用POCO,我将不得不添加许多属性,如:

[Required]
[StringLength(128)]
[DisplayNameLocalizer("FirstName", typeof(TranslationStrings))]

不建议这样做(有时我想根据视图的不同为某些属性取不同的名称)。

问题是,难道没有什么"中间"吗?例如,允许我将ViewModelEntity直接转换为POCO实体的东西将非常有用。我能做些什么来加快速度吗?还是我现在的做法是正确的?

我相信有人会说将内置控制器脚手架用于实体框架,但我构建现实世界MVC应用程序的经验是,内置脚手架适用于业余项目和POC,但在现实世界中总是远远不够。你可以建立自己的脚手架功能,但这不是我以前尝试过的。

为了回答您关于"中间"的问题,例如将视图模型映射到POCO,我强烈建议使用AutoMapper这样的映射器库。然后控制器代码会变成这样(没有测试语法错误):

[HttpPost]
public ActionResult Edit(int id, YourViewModel model)
{
if (ModelState.IsValid)
{
var poco = repository.getPoco(id);
Mapper.Map<YourViewModel, YourPoco>(model, poco);
repository.Save();
return RedirectToAction("List");
}
return View(model)
}

。。。以上这些你觉得"正常"吗?

这对我来说很正常。另一种方法是先创建单元测试。"没有时间进行单元测试"的语句非常糟糕。我认为这根本不是真的。

让我解释一下:如果你在没有单元测试的情况下实现了一个功能,那么你通常不会很早发现简单的bug。这意味着您最终需要更多的时间来实现它,因为您可以在实现该功能后添加一定的时间来修复错误。

  1. 检查需要哪些数据库表
  2. 使用迁移工具生成新数据库

。和4。点并不是真正需要的。想象一下,您可以首先使用一个简单的"内存中"存储(…也可以用于单元测试)。您以后可以真正创建数据库和表。

通常必须创建几乎与POCO实体重复的实体,然后在保存过程,我需要将其转换回适当的POCO实体,通常是这样的:

PocoEntity1 pocoEntity1 = new () 
{ 
UserName = ViewModel.UserName,
UserPicture = ViewModel.UserPicture 
(and so on) 
}

我真的同意你的看法,这有时很麻烦。但是有一个解决方案。用于该AutoMapper(有一个nuget包)

以上内容非常耗时且容易出错-另一方面手,如果我要直接使用POCO,我必须添加很多属性如:

[…]

这是不推荐的(我有时想有不同的某些属性的名称,具体取决于视图)。

为此,还有另一个不错的助手库:Fluent Validation(MVC)

这只允许您为视图模型创建验证器。这样,您就可以为同一个视图模型创建许多验证器,而无需直接装饰任何模型。

相关内容

  • 没有找到相关文章

最新更新