如何将平展视图模型用于 Web API 方法

本文关键字:用于 Web API 方法 模型 视图 | 更新日期: 2023-09-27 17:56:29

我正在创建一个 Web API 服务,该服务充当我的客户端在后端更复杂的消息传递 API 的外观。这。表示我需要对后端 API 进行的调用的 XSD 显然不是我希望他们理解的东西。我的目标是扁平化客户端可以使用的 ViewModel 类中的必需元素。我的帖子可能如下所示:

public HttpResponseMessage Post(FlattenedViewModel flattenedViewModel)
{
}

扁平视图模型的想法是防止我的客户必须理解任何复杂的数据结构来调用我的 API。提交这个(可以是JSON或XML)要容易得多:

<PersonFirstName>John</PersonFirstName>
<PersonLastName>Smith</PersonLastName>
<PersonPhone>123-456-7890</PersonPhone>

比这个:

<Person>
  <Name>
    <FirstName>John</FirstName>
    <LastName>Smith</LastName>
  </Name>
  <Communication>
     <Type>
       <Phone>123-456-7890</Phone>
     </Type>
  </Communication>
</Person>

我知道创建类结构来表示第二个示例并不困难,对我们所有人来说都很容易理解。然而,我真正的.XSD 大约是此示例的 50 倍。我的目标是提供一个更简单的界面和扁平视图的能力,所以请以此作为这个问题的约束。想象一下,就像用户在表单上输入数据并按下提交;表单类似于要输入的数据的平展视图。

我遇到的障碍如下:

  1. 拥有一个可以重复有限时间的节点是可以解决的。但是,在 .xsd: maxOccurs="unbounded"上具有以下约束的节点最初似乎不适用于平展视图。有没有另一种方法可以做到这一点,这样我就不必介绍收藏了?或者我可以引入一个集合,但仍然允许用户不必理解复杂的结构(如我的第一个示例)?如果可能的话,请举例说明情况。

  2. 我的节点名称在 .xsd 的不同部分之间重复,但不相关。 例如,节点IDDate。我的解决方案是将父节点名称附加到值以创建SubmitDatePersonID等属性。我现在遇到的问题是我的 ViewModel 类属性名称与必须在域模型中映射到的实体的属性名称不匹配。我正在使用 ValueInjecter,那么是否有任何类型的简化方法仍然可以将属性映射到具有不同名称(即注释或其他内容)的其他类?

任何帮助不胜感激,谢谢!

如何将平展视图模型用于 Web API 方法

我相信

答案在于为ValueInjector创建自定义注入以供使用,然后简单地调用"InjectFrom"来调用它们......

_person.InjectFrom<CustomPersonInjection>(flattenedViewModel);

我快速浏览了一些可能对您有所帮助的特定示例,但可以在合理的时间范围内找到任何内容(不过它们就在那里,谷歌"价值注入器自定义注射")。

以下是一些帮助您入门的链接:

深度克隆示例:http://valueinjecter.codeplex.com/wikipage?title=Deep%20Cloning&referringTitle=Home

自定义约定注入:使用 ValueInjecter 在具有不同属性名称的对象之间进行映射