【问题标题】:How can I speed up my MVC4 application DEVELOPMENT?如何加快 MVC4 应用程序的开发速度?
【发布时间】:2014-01-29 02:59:34
【问题描述】:

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

我目前正在开发一个带有数据库的标准 Web 应用程序。我选择使用 IoC 框架 (Ninject)、Entity Code First、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 实体的东西会非常有帮助。有什么我可以做的来加快速度吗,还是我现在的做事方式正确?

【问题讨论】:

    标签: c# .net asp.net-mvc-4 poco


    【解决方案1】:

    我敢肯定有人会说要为实体框架使用内置控制器脚手架,但我构建真实世界 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)
    }
    

    【讨论】:

    • 感谢您的回答 - 在 asp.net 论坛上也建议使用 AutoMapper,我会尝试一下。至于脚手架——这正是我所担心的,我会开始使用这样的东西,迟早会碰壁,并且不得不花费大量时间来创造“变通办法”(我已经以前去过那里;])。
    【解决方案2】:

    ...您觉得上面的内容“正常”吗?

    这对我来说看起来很正常。另一种方法是首先创建单元测试。 “没有时间进行单元测试”的声明非常糟糕。我认为这根本不是真的。

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

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

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

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

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

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

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

    [...]

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

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

    这仅允许您为查看模型创建验证器。有了它,您可以为同一个视图模型创建多个验证器 - 无需直接装饰任何模型。

    【讨论】:

    • +1 用于流畅验证,不需要装饰模型,但我对 AutoMapper 持中立态度。一开始我很喜欢它,后来我用得越多,它就变成了一个重构黑洞。
    • @ta.speot.is 你能详细说明一下吗?我自己从未使用过 AutoMapper,但它看起来确实不错,而且它似乎也正是为上述工作而制作的。为什么你认为它是一个重构黑洞?
    • @CSharper:相信我,我知道我应该首先创建单元测试 - 但根本没有时间,而稍后会浪费更多时间(更多时间 - 我知道),应用程序将“准备好”,现金将存入公司的银行账户;] 作为一名开发人员,我完全理解不应该这样工作 - 但我的老板不会 - “嘿,我们用这些方法创建了 50 个项目并获得了报酬,那你为什么抱怨?什么?意大利面条代码?测试?谁需要测试人员,别抱怨了!如果有什么工作,你不要改变它! - 尝试打破“逻辑”;] 感谢其他建议。
    • @zespri "Find usages of Domain.Entity.Property" 在到达 ViewModel.SomethingLikeEntity.Property = Domain.Entity.Property 之前停止,因为在对 var somethingLikeEntity = Mapper.Map&lt;SomethingLikeEntity&gt;(domainEntity) 的调用中没有直接使用 Domain.Entity.Property。祝您好运将 Property 移动到其他实体并更新用法 - 您的代码将编译,但您的模型不会巧妙地填充 Property
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多