1

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

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

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

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

问题

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

4

1 回答 1

1

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

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

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

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

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

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

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

或者,您可以按照此处所述手动编写元数据。

于 2013-07-09T20:06:10.153 回答