在我的应用程序中,我有我的域层和Web界面(其他层次我不会详细介绍)。
我的观点,使用ViewModels对象,以及数据库持久化域对象 要将ViewModel对象转换为域对象,我使用AutoMapper。
工作Breeze的问题是,当我创建一个新对象var newCust = manager.createEntity('Customer', {name:'Beta'})
时,这是一个域对象,应该是一个ViewModel对象。
不是全部,但在某些情况下,ViewModel与对象域不相似。例如,域中对象的集合是:ICollection<Person>
,而在视图模型中,ICollection<int>
int是人的PK。
在这些情况下如何使用微风?
如何使元数据也管理我的视图模型的结构,以便我可以创建我的ViewModel类型的对象?
答案 0 :(得分: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。