Entity framework 实体框架、MVVM和计算类

Entity framework 实体框架、MVVM和计算类,entity-framework,design-patterns,mvvm,ef-code-first,Entity Framework,Design Patterns,Mvvm,Ef Code First,我正在开发一个数据库应用程序,它管理特定于行业的输入,然后通过一些复杂的计算、查找等来运行这些信息,以返回一系列其他值和一个通过/不通过的结论 我决定使用实体框架(代码优先于提供程序独立性)和WPF(MVVM模式)。我使用POCO实体作为我的数据模型,视图模型处理基本数据/业务规则验证等常见问题 似乎EF+WPF/MVVM非常擅长显示和验证输入,并将其输入数据库,以便查询典型的业务应用程序,如产品、客户、订单设置。但在哪里插入“计算层”一点也不清楚。在视图模型和数据模型(我的POCO)之间,事情

我正在开发一个数据库应用程序,它管理特定于行业的输入,然后通过一些复杂的计算、查找等来运行这些信息,以返回一系列其他值和一个通过/不通过的结论

我决定使用实体框架(代码优先于提供程序独立性)和WPF(MVVM模式)。我使用POCO实体作为我的数据模型,视图模型处理基本数据/业务规则验证等常见问题

似乎EF+WPF/MVVM非常擅长显示和验证输入,并将其输入数据库,以便查询典型的业务应用程序,如产品、客户、订单设置。但在哪里插入“计算层”一点也不清楚。在视图模型和数据模型(我的POCO)之间,事情已经有点臃肿了,现在我面临着添加另一层,非常像其他两层

也许实现这一点的最佳方法是使计算层成为一种元视图模型,并将尽可能多的验证、更改通知等推入其中,并使用更轻的实际视图模型运行

有人遇到这样的情况吗

编辑

事实证明,我真正需要的是精简视图模型并增强实体。因此,我简化了视图模型,将属性更改通知和基本验证移动到实体以允许直接绑定,并使计算类直接使用实体,以及向实体添加一些基本例程。感谢您提供关于Think ADM文章@Peter Porfy的链接


为了使验证更接近实体,使用了(极好的建议@Gloopy!)。为了更容易地在实体上实现属性更改通知,进行了调整。为了避免在视图模型中创建无休止的属性包装(设置HasChanges属性),我使用了。

我可能会创建一个接口/对象来处理计算(或几个,如果可以逻辑拆分),并将该对象传递到您想使用它的任何地方。您可能会从使用依赖项注入框架中受益,因为它可能会有帮助,所以您不必在需要的地方显式实例化对象


还提到了一些可能不完全适用,但可能也有一些好的模式可供学习/使用。

我可能会创建一个接口/对象来处理计算(或几个,如果可以逻辑拆分),并将该对象传递到您想使用它的任何地方。您可能会从使用依赖项注入框架中受益,因为它可能会有帮助,所以您不必在需要的地方显式实例化对象


还提到了一些可能不完全适用的模式,但也可能有一些很好的模式可供学习/使用。

MVVM代表
模型视图视图模型,其中模型层包含模拟实际领域问题的所有内容

所以这取决于“计算层”的含义

把它放在该放的地方

如果实际操作属于域实体,则应将该逻辑放入实体中。不要制作贫血领域模型:

关于ADM

首先与EF代码完美配合

如果某些东西不属于任何实体,那么您可能应该将其作为服务公开。然后通过
界面
从viewmodels中使用它

一个容器可以让你的生活更轻松,但是没有它你也可以生活


您没有插入另一层,因为它是模型层。您的视图模型应尽可能精简,只需对视图的状态进行建模,并将实际业务操作转发给实体/服务类。

MVVM代表
模型视图视图模型,其中模型层包含建模您实际域问题的所有内容

所以这取决于“计算层”的含义

把它放在该放的地方

如果实际操作属于域实体,则应将该逻辑放入实体中。不要制作贫血领域模型:

关于ADM

首先与EF代码完美配合

如果某些东西不属于任何实体,那么您可能应该将其作为服务公开。然后通过
界面
从viewmodels中使用它

一个容器可以让你的生活更轻松,但是没有它你也可以生活


您没有插入另一层,因为它是模型层。您的viewmodels应该尽可能精简,只需对视图的状态进行建模,并将实际业务操作转发给实体/服务类。

在阅读了ADM和DDD文章(以及谷歌搜索)之后,似乎是扩展我的实体和创建服务类的混合体。我对扩展实体的犹豫是,每个人都回避它,但它也使它们更难阅读/使用。数据存储中什么是属性和什么是计算属性变得不那么清楚了,有很多额外的标记指示EF应该忽略什么,等等。我是在过度复杂化它还是有一种“安全”的方法来扩展实体?我不认为“每个人都回避它”,但你是对的,更多的人使用ADM。这样,您可以从清晰的程序(!)风格的doman层中获益,但失去了OOP的好处。这取决于每个人的选择,我相信两者都有自己的位置。有了正确的实体设计(ggl it),它不会变得不清晰,但更具可读性和可遵循性。总之,EF和其他ORM是为了隐藏应用程序状态的某些部分存储在数据库中的事实,以便您可以保持OOP风格的编码。你不应该放弃你的领域模型带来的好处。如果不想让实体与属性混淆,也可以在datacontext配置中指定要忽略的内容。不要将其视为“扩展实体”,因为它不是扩展,而是创建具有行为的真正OOP类。