Fau*_*ust 3 entity-framework viewmodel asp.net-mvc-2
我正在尝试了解我的MVC2网站的最佳架构.
由于我一直在尝试使用Entity Framework将数据输入和输出数据库,我开始意识到我到目前为止构建的简单域模型并未映射到我计划视图的所有需求.所以我正在考虑遵循这个问题的对应答案:为什么两个类,视图模型和领域模型?.
但是,在域模型和EF模型之间我可以看到的似乎存在少量收益的冗余,我甚至无法理解概念差异.我没有要求在未来切换数据源,我也不认为需要切换我的ORM解决方案.
问题:
如果我遵循这种模式,那么,由于我使用的是实体框架,我不应该只使用我的EF实体直接作为域模型服务吗?(注意:我没有想过通过"怎么样",但是答案也很受欢迎.)或者我仍然建议管理一组单独的域模型?
看来你在这里有一些冗余.读你的段落:
但是,在域模型和EF模型之间我可以看到的似乎存在少量收益的冗余,我甚至无法理解概念差异.
我认为EF模型和您的域模型之间没有真正的区别.在我创建的项目中,我的EF模型是我的域模型.
不过,我的域模型类是不一样的我的ViewModels.Domain模型类可能包含View不感兴趣的数据,或者视图可能需要根据视图中的信息计算/评估的信息.一个简单的例子可能是:
public class Session // Domain model (and EF Model
{
public int Id {get; set; }
public DateTime Start {get; set; }
public int DurationInMinutes {get; set; }
}
public class SessionViewModel // The viewmodel :p
{
public DateTime Start {get; set; }
public int DurationInMinutes {get; set;}
public DateTime End
{
get
{
return Start.Add(TimeSpan.FromMinutes(DurationInMinutes));
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我有兴趣在我的视图中显示实际的结束时间,但我没有兴趣将它存储在数据库中,因为这可能导致数据差异(如果数据被破坏,则DurationInMinutes + Start可能不等于End保存时)
当我第一次以这种方式开始编码时,我最终做了大量的手动工作,将我的Domain模型映射到ViewModels,然后又回来了.AutoMapper改变了所有这一切:谷歌它,或NuGet它,它将使你的生活更轻松:)
希望这有所帮助.请评论,如果我完全错过了这一点:)
更新以解决评论
然后,DataAnnotations将应用于ViewModel,因为通常DataAnnotations表示如何在View中显示和验证数据.
例如,您可以将[Required]属性设置public DateTime Start {get; set;}为依次为Html.DisplayFor扩展根据您的数据注释自动验证您的HTML.
根据定义(无论如何),域模型不应包含与业务逻辑相关的任何代码或逻辑.域模型只负责根据您的数据存储区包含非常原始的数据.就个人而言,我喜欢在其间放置某种服务层,负责获取数据并返回ViewModel,并且反之亦然.
最终目标是避免直接从控制器引用您的域模型.
当然,所有这些要点都必须参考项目的规模进行权衡.这样做只是为了模拟一个测试站点当然有点过分 - 但在任何其他你可能会部署可能扩展,扩展或以其他方式改变的项目中,这是一个很好习惯,因为它认真对待提高你这样做的能力.
这种方法的另一个关键点是,您不得不将操作抽象为更小,更可管理的单元,从而实现更好,更精确的单元测试.
| 归档时间: |
|
| 查看次数: |
1442 次 |
| 最近记录: |