【问题标题】:Strategies for "Flexible Webservice"“灵活 Web 服务”的策略
【发布时间】:2013-12-16 18:40:22
【问题描述】:

我正在为许多不同的客户构建网络服务,以连接到汽车零件数据库。该部件具有多种特性。不同的客户需要不同的属性子集来“做他们的事情”。

所有客户都至少需要一个 ID、一个部件号和一个名称。有些可能需要价格,有些可能需要图像的 URL,等等。下一个客户端可能会在几年后编写,并且需要不同的属性子集。我宁愿不要发送超过他们需要的东西。

我一直在为每个要求构建具有属性子集的单独“PartDTO”,并将它们作为单独的 Web 服务方法提供,以返回相同的部件列表,但每个部件具有不同的属性。与其为每个客户建立这个并为 DTO 和方法提出逻辑名称,我想要一种让客户指定他们想要什么的方法。我正在返回 JSON,所以我正在考虑客户端向我传递一个 JSON 对象,其中列出了他们在结果集中想要的属性:

ret = { ImageUrl: true, RetailPrice: true, ... }

首先,这有意义吗?

其次,我不想在这里失去的是返回 IEnumerable 并让 JSON 工具序列化它的好语法。我当然可以建立一个“JSON”字符串并返回它,但这看起来很笨拙。

建议? C#'动态'?

【问题讨论】:

  • 我见过 API(Jira 就是其中之一),可以让您在输入中指定所需的字段。我认为 Jira 使用查询参数(扩展他们称之为)。使其成为逗号分隔的字段名称列表。 /v1/api/entity?fields=ImageUrl,RetailPrice 这样任何给定的客户都可以只请求所有字段的特定子集。

标签: c# json web-services


【解决方案1】:

这是Entity-Attribute-Value model 的一个非常好的候选者。基本上,您有一个 ID、名称、值的表,并且您允许每个客户/方面存储他们想要的任何内容......然后当他们查询时,您返回他们的名称-值对并让他们随意使用它们。

优点:超级灵活。适用于强模式增加大量复杂性与价值的情况。多个客户端的单一端点。

缺点:通常不喜欢模式,很难有效地从中选择,也很难索引。但是,如果您所做的只是存储和返回名称-值的集合,那应该没问题。

【讨论】:

    【解决方案2】:

    我最终选择了字典路线。我定义了一个基类:

    public abstract DictionaryAsDTO<T> : IReadOnlyDictionary<string, object>
    {
        protected DictionaryAsDTO(T t, string listOfProperties)
        {
            // Populate an internal dictionary with subset of t's props based on string
        }
    }
    

    然后是 Part 的 DTO,如下所示:

    public PartDTO : DictionaryAsDTO<Part>
    {
        public PartDTO(Part p, string listOfProperties) : base(p, listOfProperties) {}
    
        // Override method to populate base's dictionary with Part properties based on
        // listOfProperties
    }
    

    然后我为 DictionaryAsDTO 编写了一个 JSON.NET 转换器,它发出 JSON-y 对象属性而不是键值对。

    Web 服务基于返回 IEnumerable 的查询构建一个 IEnumerable 并将其序列化。

    维奥拉!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2012-09-15
      • 2011-02-28
      相关资源
      最近更新 更多