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

时间:2015-11-26 09:36:07

标签: c# json web-services api architecture

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

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

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

你有什么建议吗?

2 个答案:

答案 0 :(得分:3)

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

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

这看起来像这样:

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。我在这些例子中遗漏了它,转换它们是直截了当的。

答案 1 :(得分:0)

这里要考虑的事情很少

  • 您需要APIResult课吗?你打算用它做什么?如果你有一个记录良好的REST api(比如说odata api),那么响应就会得到很好的描述,你可以验证你得到的响应是你需要的。否则,如果不匹配,你打算做什么?

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

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