我知道这听起来很奇怪 - 请允许我解释一下:
我目前正在使用数据库开发标准Web应用程序。我选择使用IoC框架(Ninject),实体代码优先,Bootstrap和其他一些相关技术。我已经用UML转录了一个数据库模型,现在我正在尝试逐步实现它。这通常是这样的:
第一个问题是 - 以上看起来对你来说是“正常的”吗?也许我错过了一些可以加速我发展的东西?或许我应该添加更多步骤 - 例如 - 尽早发现更多错误?
现在下一步是创建视图,所以我做了类似这样的事情:
上述方法的问题是:
我经常要创建几乎POCO实体的副本,然后 - 在保存过程中,我需要将其转换回适当的POCO实体,通常是这样的:
PocoEntity1 pocoEntity1 = new ()
{
UserName = ViewModel.UserName,
UserPicture = ViewModel.UserPicture
(and so on)
}
以上是非常耗时且容易出错的 - 另一方面,如果我直接使用POCO,我将不得不添加许多属性,如:
[Required]
[StringLength(128)]
[DisplayNameLocalizer("FirstName", typeof(TranslationStrings))]
并不建议这样做(我有时希望某些属性具有不同的名称,具体取决于视图)。
问题是 - 介于两者之间是否有任何“?例如,允许我将ViewModelEntity直接转换为POCO实体的东西将非常有用。有什么我可以做的事情来加快速度,或者我现在正在以正确的方式做事吗?
答案 0 :(得分:4)
我确信有人会说使用内置控制器脚手架来实现实体框架,但我构建真实世界MVC应用程序的经验是,内置脚手架对于业余爱好项目和POC来说很好,但总是很短暂在现实世界。你可以构建自己的脚手架功能,但这不是我以前尝试过的。
要回答有关“介于两者之间”的问题,例如:将您的viewmodel映射到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)
}
答案 1 :(得分:3)
......以上看起来对你来说是“正常的”吗?
对我来说这看起来很正常。另一种方法是首先创建单元测试。声明“没有时间进行单元测试”非常糟糕。我认为这根本不是真的。
让我解释一下: 如果您实现的功能没有单元测试,那么您通常不会提前发现简单的bug。这意味着您需要在最后有更多时间来实现它,因为您可以在实现该功能后立即添加一些时间来修复错误。
- 检查需要哪些数据库表。
- 使用迁移工具生成新数据库
醇>
实际上并不需要2.和4.点。想象一下,您可以先使用简单的“内存”存储(...也可以用于单元测试)。您可以稍后创建数据库和表。
通常必须创建几乎POCO实体的副本,然后 - 期间 保存程序,我需要将其转换回适当的POCO 实体,通常是这样的:
PocoEntity1 pocoEntity1 = new () { UserName = ViewModel.UserName, UserPicture = ViewModel.UserPicture (and so on) }
我真的同意你这有时很麻烦。 但是......有一个解决方案。用于AutoMapper(有一个nuget包)
上述内容相当耗时且容易出错 - 另一方面 如果我直接使用POCO,我将不得不添加很多 属性如:
[...]
并不建议这样做(我有时希望有所不同 某些属性的名称,具体取决于视图。
为此,还有另一个很好的帮助库:Fluent Validation (MVC)
这只是允许您为查看模型创建验证器。有了它,您可以为同一个视图模型创建许多验证器 - 无需直接装饰任何模型。