如何设计一个包含Web服务结果的类

本文关键字:Web 包含 服务 结果 一个 | 更新日期: 2023-09-27 18:24:23

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

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

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

你有什么建议吗?

如何设计一个包含Web服务结果的类

将结果状态与实际数据分离

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

这可能看起来像这样:

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。我在这些例子中省略了这一点,转换它们是直接的。

这里需要考虑的事情很少

  • 您需要APIResult类吗?你打算怎么处理它?如果您有一个记录良好的RESTapi(比如odataapi),那么响应就会得到很好的描述,并且您可以验证您得到的响应是否是您所需要的。否则,如果不匹配,你会怎么办?

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

  • 你的回答有什么商业意义?结果总是一个硬名字。然而,如果你有FirstName、LastName、AddressList等属性,那么它会变得更好。

相关文章: