【问题标题】:Working with Breeze + ViewModels使用 Breeze + ViewModels
【发布时间】:2013-07-06 06:04:09
【问题描述】:

在我的应用程序中,我有我的域层和 Web 界面(其他层我不会详细介绍)。

我的视图,使用 ViewModels 对象和数据库持久化域对象。
要将 ViewModel 对象转换为域对象,我使用 AutoMapper。

Breeze 的问题在于,当我创建一个新对象 var newCust = manager.createEntity('Customer', {name:'Beta'}) 时,这是一个域对象,应该是一个 ViewModel 对象。

并非全部,但在某些情况下,ViewModel 与对象域不同。例如,域中的对象集合是:ICollection<Person> 而在视图模型中是 ICollection<int> int 是人的 PK。

问题

在这些情况下如何使用微风?
如何使元数据也管理我的视图模型的结构,以便我可以创建我的视图模型类型的对象?

【问题讨论】:

  • ViewModel 和域对象不一样。 ViewModel 可能并且经常会公开域对象。您可以使用 durandal.js 之类的框架来处理 view-viewmodel 组合(以及更多)。
  • 所以?我从来没有说过他们是一样的!问题是如何使用 Breeze 和 ViewModels。在 Breeze 元数据中只定义域对象。我需要创建 ViewModel 对象!

标签: asp.net-web-api odata breeze


【解决方案1】:

@ridermansb - 因为您提到了 AutoMapper,所以我假设您的映射是在服务器上进行的。您希望您的服务器 API 公开“ViewModels”(在这种情况下,您可能称它们为 DTO)而不是域模型对象。有时,您的 ViewModel 会准确地反映您的域对象;有时他们不会。

您的客户只能看到您的 API 公开的内容。如果这是一个 BreezeJS 客户端,您可能会将 ViewModel 视为客户端实体。在您期望 Breeze 查询、缓存、更改跟踪和验证它们的意义上,它们是 Breeze 实体。 BreezeJS 不知道这些“实体”是对应于服务器端 DTO 还是服务器端业务对象。

当然,如果您使用的是 DTO/ViewModel,您的服务器代码负责在 DTO 表单和域对象表单之间进行转换。大概这个逻辑位于服务器端 API 层和域层之间/之间的某个地方。

如果您选择了这种架构,那么您就选择了处理 ViewModel 和域对象之间的双向转换,并且已经接受了所有的复杂性和麻烦。在这方面我没有任何建议。

因此,让我重新表述并缩小您的问题:“如何获取描述服务器端 API 公开的对象模型的元数据?”

我最喜欢的方式(假设是 .NET 服务器)是让 EF 为我做这件事。我创建了一个 DbContext,它引用的不是我的域模型类,而是我的 ViewModel/DTO 类。当然,这些类实际上不会映射到真实的数据库。没问题;他们不必这样做。您永远不会使用此 DbContext 来访问数据。您只会使用它来生成元数据。您正在使用 EF 作为设计时、元数据生成工具……就是这样。这是一种高效的可维护方法。

我希望“很快”展示这种技术,但我最近很忙,所以没有承诺。

或者,您可以手动编写元数据as described here

【讨论】:

  • 我不知道这种方法如何适合我的架构。关于“类实际上不会映射到真正的数据库”这可能会带来各种问题,不知道是否同意这一点,会破坏 EF 的某些功能,例如迁移。
  • 为什么会发生这种情况?什么迁移?您将迁移与数据库一起使用。没有与此“MetadataDbContext”关联的数据库。它只是描述 EF+Breeze.NET 可以转换为元数据的“实体模型”的工具。不涉及“架构”。再次......我们正在谈论映射您的 DTO......将它们映射到任何地方。
  • 我认为您将生产与设计时工具混淆了。没有架构问题。没有实际障碍。反正你已经在使用 EF,所以你不能说你讨厌 EF。忽略脚手架。忽略迁移。生成元数据字符串,将其导出到文件(它会生成一个不错的 JSON javascript 文件,例如“metadata.js”),然后将其加载到您的 SPA shell 网页上。停止担心纯度,你会睡得更好。 :-)
  • 感谢您的尝试。很快回来:-)
  • 另请参阅有关此主题的 Breeze 文档:Entity Framework as a metadata design tool
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多