c# - 如何设计一个包含网络服务结果的类

标签 c# json web-services api architecture

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

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

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

你有什么建议吗?

最佳答案

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

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

这看起来像这样:

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; }
}

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

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

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

另外,您可能想让代理使用async。我在这些示例中省略了它,转换它们很简单。

关于c# - 如何设计一个包含网络服务结果的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33935017/

相关文章:

c# - 接口(interface)上的属性

javascript - 使用 json 的 d3.js 中的不完整图表

c# - 如何在 IIS 6.0 上的 asmx Web 服务中请求之前调用 Application_Start(在 Global.asax.cs 中)

rest - 在 Rest 中使用 POST 进行删除/更新?

json - JSON获取全数字

android - 如何将结果从 "AsyncTask doInBackground from different class"放到 "TextView in MainActivity"

c# - 使用 C# 获取网络摄像头状态

c# - 在 C# 中使用动态数据填充 Crystal Reports 等控件

c# - Git忽略对单行的更改

ios - 如何使用 sbjson 在 iOS 中读取 json