gpt4 book ai didi

entity-framework - EF 实体作为域模型,当将它们与 View 模型的 View 分离时?

转载 作者:行者123 更新时间:2023-12-04 08:36:02 26 4
gpt4 key购买 nike

我正在尝试了解我的 MVC2 站点的最佳架构。

由于我一直在尝试使用 Entity Framework 将数据输入和输出数据库,我开始意识到我迄今为止构建的简单域模型并不能满足我计划 View 的所有需求。所以我正在考虑遵循这个问题的公认答案:Why Two Classes, View Model and Domain Model? .

但是,域模型和 EF 模型之间似乎存在冗余,而且 yield 很小,我什至无法理解概念上的差异。我不需要在路上切换数据源,而且我也不认为需要切换我的 ORM 解决方案。

题:
如果我遵循这种模式,那么由于我使用的是 Entity Framework ,我不应该只使用我的 EF 实体直接作为域模型吗? (注意:我还没有考虑过“如何”,但也欢迎回答。)还是建议我管理一组单独的域模型?

最佳答案

看来你这里有一些冗余。阅读你的段落:

But there seems to be redundancy with little payoff that I can perceive between the domain-models and the EF models, and I can't even hardly understand the conceptual difference.



我认为 EF 模型和您的域模型之间没有真正的区别。在我创建的项目中,我的 EF 模型 我的域模型。

但是,我的域模型类是 不是 和我的 ViewModel 一样。域模型类可能包含 View 不感兴趣的数据,或者 View 可能需要根据 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));
}
}
}

在这个例子中,我有兴趣在我的 View 中显示实际的结束时间,但我没有兴趣将它存储在数据库中,因为这可能会导致数据差异(如果数据损坏,DurationInMinutes + Start 可能不等于 End保存时)

当我第一次开始以这种方式编码时,我最终做了很多手动工作,将我的领域模型映射到 ViewModel,然后再映射回来。 AutoMapper 改变了这一切:) 谷歌它,或者 NuGet 它,它会让你的生活更轻松:)

希望这有所帮助。如果我完全忽略了这一点,请发表评论:)

更新以解决评论

然后将 DataAnnotations 应用于 ViewModel,因为通常 DataAnnotations 表示数据应如何在 View 中显示和验证。

例如,您可以输入 [Required] public DateTime Start {get; set;} 上的属性为了让 Html.DisplayFor 扩展根据您的数据注释自动验证您的 HTML。

根据定义(无论如何),域模型不应该包含与您的业务逻辑相关的任何代码或逻辑。域模型只负责根据您的数据存储包含非常原始的数据。就我个人而言,我喜欢在中间放置某种服务层,负责获取数据和返回 ViewModel,也可以做相反的事情。

最终目标是避免直接从 Controller 引用域模型。

当然,所有这些点都必须引用项目的大小来权衡。仅仅为了模拟一个测试站点而做这一切肯定是矫枉过正的——但在任何其他项目中,你实际上将部署一些可能会扩展、扩展或以其他方式改变的东西,这是一个很好的习惯,因为它是认真的提高你这样做的能力。

这种方法的另一个关键点是,您被迫将操作抽象为更小、更易于管理的单元,从而实现更好、更精确的单元测试。

关于entity-framework - EF 实体作为域模型,当将它们与 View 模型的 View 分离时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5674670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com