Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何设计包含Web服务结果的类_C#_Json_Web Services_Api_Architecture - Fatal编程技术网

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

C# 如何设计包含Web服务结果的类,c#,json,web-services,api,architecture,C#,Json,Web Services,Api,Architecture,问题 我调用不同的webservices,它们返回json字符串。我将这些字符串解析为自定义对象,并将它们保存在名为APIResult的“结果类”中。例如,一个Web服务返回列表OBJ1,另一个返回OBJ2,有时还返回两个或多个对象。结果类将返回给使用对象和一个布尔值(指示请求是否成功)调用它的方法 这是可行的,但当我不得不调用许多不同的Web服务时,类会变得丑陋。现在我有7个属性,比如OBJ1、OBJ2、List、List等等。为了避免向APIResult类添加更多属性,我想重新设计它,使其更

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

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

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


你有什么建议吗?

这里很少有需要考虑的事情。

  • 你需要一门APIRESS课程吗?你打算用它做什么?如果您有一个记录良好的restapi(比如odataapi),那么响应将得到很好的描述,您可以验证您得到的响应是您所需要的。否则,如果不匹配,你会怎么做

  • <> >如果你只是把它解析成你的模型,你甚至可以考虑通用的项目来保持你的反应。然后可以检查此作业对象的属性/子对象。您甚至可以将其传递到(newtonsoft)json序列化程序中,并让调用方法说明它应该是什么样子

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


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

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

这可能看起来像这样:

public class ApiResult<T>
{
    public bool Success { get; }

    public T Dto { get; }

    public ApiResult(bool success, T dto)
    {
        Success = success;
        Dto = dto;
    }
}
public interface ISomeServiceProxy
{
    ApiResult<Dto1> GetTheThing(string someParam);
}
有了它,您现在可以为您调用的web服务定义代理。代理接口可以如下所示:

public class ApiResult<T>
{
    public bool Success { get; }

    public T Dto { get; }

    public ApiResult(bool success, T dto)
    {
        Success = success;
        Dto = dto;
    }
}
public interface ISomeServiceProxy
{
    ApiResult<Dto1> GetTheThing(string someParam);
}
公共接口服务代理
{
ApiResult GetTheThing(字符串someParam);
}
在该接口的实现中,您需要使用JSON.NET将响应反序列化为
Dto1
,并将其包装为
apireult

此外,您可能希望使代理使用
async
。我在这些例子中没有提到,转换它们是很简单的