【问题标题】:How to design a class containing the result from a webservice如何设计一个包含 Web 服务结果的类
【发布时间】:2016-02-29 08:03:15
【问题描述】:

问题 我调用不同的 web 服务返回 json 字符串。我将这些字符串解析为自定义对象,并将它们保存在名为 APIResult 的“结果类”中。例如,一个 Web 服务返回一个列表 OBJ1,另一个返回 OBJ2,有时还会返回两个或多个对象。结果类将返回给调用它的方法,其中包含对象和指示请求是否成功的布尔值。

这可行,但是当我必须调用许多不同的 Web 服务时,该类变得丑陋。现在我有 7 个属性,如 OBJ1、OBJ2、List、List 等。为了避免向 APIResult 类添加更多属性,我想重新设计它以使其更灵活,但我不确定什么是最好的方法。

想法 泛型似乎是个好主意。我可以用 new APIResult(ObjectType) 初始化我的类,然后拥有一个或多个属性 T Data1。拥有三个属性 T Data1、T Data2、T Data3 还是有点难看。我也不确定是否可以将对象从 json 解析为没有反射的泛型类型,以及这是否会减慢速度。

你有什么建议吗?

【问题讨论】:

    标签: c# json web-services api architecture


    【解决方案1】:

    将结果状态与实际数据分开。

    正如您所建议的,泛型是一个有用的工具。创建一个封装成功/失败逻辑并(在成功的情况下)提供对数据的访问的结果状态类。

    这可能看起来像这样:

    public class ApiResult<T>
    {
        public bool Success { get; }
    
        public T Dto { get; }
    
        public ApiResult(bool success, T dto)
        {
            Success = success;
            Dto = dto;
        }
    }
    

    现在将数据类设计为没有任何逻辑的简单属性包。它们的唯一目的是定义从特定 Web 服务返回的数据。此外,不要尝试构建深度继承层次结构。将相同的属性添加到两个不同的 DTO 是可以的。

    public class Dto1  
    {
        string PropertyA { get; set; }
        string PropertyB { get; set; }
    }
    
    public class Dto2  
    {
        string PropertyA { get; set; }
        string PropertyC { get; set; }
    }
    

    有了这个,您现在可以为您调用的 Web 服务定义代理。代理接口可能如下所示:

    public interface ISomeServiceProxy
    {
        ApiResult<Dto1> GetTheThing(string someParam);
    }
    

    在此接口的实现中,您需要使用 JSON.NET 将响应反序列化为 Dto1 并将其包装在 ApiResult 中。

    另外,您可能想让代理使用async。我在这些示例中省略了这一点,转换它们是直截了当的。

    【讨论】:

      【解决方案2】:

      这里有几件事需要考虑

      • 您需要 APIResult 类吗?你打算用它做什么?如果您有一个有据可查的 REST api(比如一个 odata api),那么响应就会得到很好的描述,您可以验证您得到的响应是否是您所需要的。不然不匹配怎么办?

      • 如果您只是要将其解析到您的模型中,您甚至可以考虑使用通用 JObject 来保存您的响应。然后您可以检查此 JObject 上的属性/子对象。您甚至可以将其传递给 (newtonsoft) json 序列化程序,并让调用方法说出它应该是什么样子。

      • 您的回复有什么商业意义?结果始终是一个硬名称。但是,如果您有 FirstName、LastName、AddressList 等属性,那么它会变得更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        • 2012-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-10
        • 2014-09-13
        相关资源
        最近更新 更多