1

我正在创建一个 Web API 服务,它充当我的客户对后端更复杂的消息传递 API 的门面。代表我需要对后端 API 进行调用的 .XSD 显然不是我希望他们理解的。我的目标是展平客户端可以使用的 ViewModel 类中所需的元素。我的 POST 可能如下所示:

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. 我的解决方案是将父节点名称附加到值以创建类似SubmitDateor的属性PersonID。我现在遇到的问题是我的 ViewModel 类属性名称与必须映射到域模型中的实体名称不匹配。我正在使用 ValueInjecter,那么是否有任何类型的简化方式我仍然可以将属性映射到具有不同名称(即注释或其他内容)的其他类?

任何帮助表示赞赏,谢谢!

4

1 回答 1

0

我相信答案在于创建供 ValueInjector 使用的自定义注入,然后简单地调用“InjectFrom”来调用它们......

_person.InjectFrom<CustomPersonInjection>(flattenedViewModel);

我快速浏览了一些具体示例,这些示例可能对您有所帮助,但可以在合理的时间范围内找到任何东西(尽管它们在那里,谷歌'valueinjecter custom injections')。

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

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

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

于 2013-02-13T15:36:38.773 回答