如何使用第三方网络服务避免代码重复 - 不使用动态?

2024-04-15

我正在使用第三方网络服务,其所有方法都具有以下签名:

SomeResponseClass SomeMethod(SomeRequestClass request)

每个方法都有自己的请求类和响应类,但是所有请求和所有响应都有一些共同点。

每个请求类都有几个用于识别的属性:username and token,每个响应类都有几个属性来指示是否存在错误:status and error.

我正在寻找一种优雅的方法来创建一个实例化我的请求的方法 - 这样我就不必在调用服务的每个方法中重复自己。由于我无法更改这些类,并且所有类都没有通用的接口或基类,因此我找到的唯一解决方案是使用dynamic:

private T CreateRequest<T>() where T : new()
{
    if(string.IsNullOrEmpty(_Token))
    {
        Login();
    }
    // this has to be dynamic for the next 2 rows to pass compilation.
    dynamic request = new T();
    request.username = _UserName;
    request.token = _Token;
    return (T)request;
}

类似于从服务响应中填充我自己的实体:

// response have to be dynamic for getting the error and status properties
private static T CreateServiceResponse<T>(dynamic response) where T : ServiceResponse, new()
{
    T result = new T();
    result.Error = (response == null) ? "Service response is null" : response.error;
    result.Status = (response == null) ? -1 : response.status;
    return result;
}

(此方法在我用来填充实体的每个方法中使用(全部源自ServiceResponse)以及来自服务响应的数据。)

有没有办法在不使用的情况下做这样的事情dynamic? 对我来说,这有点像使用肮脏的黑客......

如果我能以某种方式“注入”一个用于所有要实现的请求的通用接口和一个用于所有要实现的响应的通用接口,我可以使用简单的泛型,但我想这是不可能的,或者是吗?


当您使用由 Visual Studio 创建的服务引用时,所有生成的类都标记为partial。这意味着您可以使用自己的代码扩展它们。在您的情况下,这将是一个提供重复属性的接口。您可以将该接口用作通用约束。

您首先创建通用接口。为了使事情变得简单,您可以为服务参考中定义的公共属性使用相同的名称和类型:

interface IRequest {
    string username { get; set; }
    string token { get; set; }
}

然后,您创建一个代码文件,并在与服务引用相同的命名空间中为每个服务请求类(具有相同的名称)定义一个分部类。这些类中的每一个都实现您的接口:

partial class SomeRequestClass : IRequest {}

选择相同的属性名称和类型后,您不必专门实现该接口。

最后使用通用约束:

private T CreateRequest<T>() where T : IRequest, new()
{
    if(string.IsNullOrEmpty(_Token))
    {
        Login();
    }
    T request = new T();
    request.username = _UserName;
    request.token = _Token;
    return request;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用第三方网络服务避免代码重复 - 不使用动态? 的相关文章

随机推荐

  • Angular 6 嵌套 FormGroup 模板验证

    我的表单组结构如下所示 order component ts this orderForm this formBuilder group customer this formBuilder group name Validators req
  • 没有任何成员的界面 - 不好的做法? [复制]

    这个问题在这里已经有答案了 可能的重复 标记接口的目的是什么 https stackoverflow com questions 1023068 what is the purpose of a marker interface 创建一个完
  • IIS,拒绝访问静态文件;这个例子有什么问题吗?

    我试图获取默认情况下允许访问的最简单示例 除非通过 IIS 中特定目录的身份验证 否则拒绝访问 当你谷歌周围时 每个人都说这很简单
  • 在中等信任度下以编程方式修改配置部分

    我的应用程序中有一个自定义 ConfigurationSection public class SettingsSection ConfigurationSection ConfigurationProperty Setting publi
  • 以特定方式排列数据框

    提前抱歉 标题不好 但我真的不知道如何简洁地表达它 我正在使用一个数据框 其中的项目可以属于 4 个类别中的任何一个 而不限于 1 个类别 这是我正在使用的虚拟矩阵的示例 ID lt 1 7 A lt c 1 0 0 1 1 0 0 B l
  • C++ 中的转换运算符

    请帮助我了解 C 中的转换运算符到底是如何工作的 我在这里有一个简单的例子 我试图理解它 尽管编译器实际上是如何进行转换的并不是很清楚 class Example public Example Example int val operato
  • 使用PHP动态添加到.htaccess文件?

    我想做的是自动化网站上线的过程 这些网站都是使用htaccess动态创建的 所以这里是一个例子 RewriteCond ENV REDIRECT STATUS RewriteCond HTTP HOST www domain com NC
  • 使用 biml 分配属性以执行包任务 ssis 对象

    使用 biml 通过 Visual Studio 中的 BIDS 帮助程序 如何为 SSIS 2008 执行包任务对象的属性赋值 特别是 位置 SQL Server 连接 SomeConnectionString 使用 BIML 我已经搜索
  • 如何修复 Android studio 中调用失败来自服务器的意外响应:未经授权

    我有一个项目Gitlab https gitlab com我最近几天一直在用它 现在我想要pull在我的家用电脑上进行项目 但显示以下错误 Invocation failed Unexpected Response from Server
  • 如何在for循环中添加不同大小的numpy数组条目(类似于Matlab的元胞数组)?

    我正在尝试在 python numpy 中实现 Matlab 元胞数组的模拟 Matlab 代码如下 for n 1 10 C n rand 1 n end 请注意 每个单元格元素都有不同的长度 现在在 numpy 中 for n in n
  • 来自 scatter3 数据的 matlab 3d 曲面图

    我想在同一个图上绘制带有曲面图的 3d 散点图 这样我最终会得到如下结果 我本以为下面的代码可能已经实现了我想要的 但显然没有 我有x y and z绘制数据scatter3 x 1 1 1 1 0 95 0 95 0 95 0 95 0
  • 在 Javascript 中添加和减去字符串和数字 - 自动类型转换?

    让我们看一下下面的 JavaScript 代码 在第一个警报框中 显示 2 和 8 串联的结果 即28 然而 在第二个警报框中 它显示两个数字的减法 即6 How The 运算符超载 如果任何操作数是字符串 则执行字符串连接 如果有两个数字
  • Windows.h - 焦点进入文本输入时的通知

    我正在尝试提出一种解决方案 用于在焦点进入文本字段时设置通知 最终目标是通过屏幕键盘重新创建您在移动设备上看到的功能类型 到目前为止我一直在探索SetWinEventHook with EVENT OBJECT FOCUS and GetG
  • 实现领域驱动设计的函数式方法

    我在使用 C 编写领域驱动应用程序方面拥有丰富的经验 我编写的应用程序越多 我就越发现我想要采用一种不太适合标准 C OO 技术的方法 我想编写尽可能多的纯函数 因为它们真的很容易测试 我想以更具声明性的方式编写我的业务逻辑 所以我一直在研
  • Java/MSSQL:java.sql.SQLException 无效的对象名称“TableName”

    我正在尝试将 java 应用程序从旧服务器移动到新服务器 该应用程序在 Tomcat 上运行 使用 Microsoft SQL Server 作为后端数据库 并使用数据源 ODBC 中定义的系统 DSN 来决定连接到哪里 旧服务器使用Win
  • 调用 SWIG 生成的 JNI 时出现 UnsatisfiedLinkError?

    我正在尝试创建一个可从 Java 调用的 C 动态库 我在下面编译了一个DLLCygwin http www cygwin com using SWIG http www swig org Doc1 3 Java html compilin
  • Ember 路由、控制器、视图

    我已阅读 Ember js 网站上的大部分初学者指南 但我仍然对放置内容的正确位置感到困惑 Route 根据在线研究 人们建议将与路由相关的逻辑放入路由中 一切都很好 但我唯一能想到的是this transisionTo 我在其他地方读到所
  • Asp.net 超链接控件相当于

    我想在 asp net 中定义一个 HyperLink 控件 它生成类似于以下内容的 html 输出 a href a 如何才能做到这一点 我同意 SLAks 的观点 但你就这样吧
  • 苹果推送通知限制

    我想知道我们一次向用户发送的苹果推送通知的数量是否有限制 我可以使用 APNS 服务一次发送 100 000 个推送通知吗 如果您在短时间内向同一设备发送多个通知 推送服务将仅发送最后一个通知 https developer apple c
  • 如何使用第三方网络服务避免代码重复 - 不使用动态?

    我正在使用第三方网络服务 其所有方法都具有以下签名 SomeResponseClass SomeMethod SomeRequestClass request 每个方法都有自己的请求类和响应类 但是所有请求和所有响应都有一些共同点 每个请求