You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Service Reference生成的分部类应用接口以统一填充公共数据

这问题我之前帮好几个开发者解决过,Service Reference生成的分部类确实容易遇到这种重复代码的问题,用接口+通用方法来处理是最优雅的方案了,给你一步步拆解:

解决方案:用接口统一分部类,实现通用填充逻辑

首先,我们要先定义一个包含所有公共属性的接口,把那些每个自动生成的分部类都有的字段/属性都放进去。比如假设所有类都有UserId、RequestTime、AppKey这几个公共属性:

public interface ICommonServiceRequest
{
    string UserId { get; set; }
    DateTime RequestTime { get; set; }
    string AppKey { get; set; }
    // 这里继续添加所有类共有的其他属性
}

接下来,给每个自动生成的分部类添加接口实现——重点是,我们不用修改Service Reference自动生成的代码(不然下次更新服务就会被覆盖),而是新建一个单独的.cs文件,用分部类的特性来扩展:

比如自动生成的类叫SubmitOrderRequest,那我们新建文件写:

// 注意命名空间要和自动生成的类完全一致!
namespace YourServiceReferenceNamespace
{
    public partial class SubmitOrderRequest : ICommonServiceRequest
    {
        // 不需要写任何代码,因为自动生成的类已经有对应的属性了,只要声明实现接口就行
    }

    // 其他生成的类同理,比如QueryStockRequest
    public partial class QueryStockRequest : ICommonServiceRequest
    {
    }
}

然后,写一个通用的填充函数,只要接收ICommonServiceRequest类型的参数,就能给任何实现了这个接口的类填充公共数据:

public static void FillCommonRequestData(ICommonServiceRequest request)
{
    if (request == null)
        throw new ArgumentNullException(nameof(request));

    request.UserId = GetCurrentUserId(); // 假设这是你获取当前用户ID的方法
    request.RequestTime = DateTime.UtcNow;
    request.AppKey = "YourFixedAppKey";
    // 其他公共属性的赋值逻辑都放在这里
}

之后使用的时候就非常简单了,不管哪个请求类,直接传入这个函数就行:

var orderRequest = new SubmitOrderRequest();
FillCommonRequestData(orderRequest); // 自动填充所有公共属性

var stockRequest = new QueryStockRequest();
FillCommonRequestData(stockRequest); // 同样适用

几个关键注意点

  • 确保接口里的属性名称、类型和自动生成的类完全匹配,不然会编译报错。如果自动生成的属性是int类型的UserId,接口里也要对应写成int UserId { get; set; }。
  • 分部类的命名空间必须和自动生成的类一致,不然编译器会认为是两个不同的类。
  • 如果后续更新Service Reference,只要自动生成的类的公共属性没有变化,我们写的扩展代码完全不用修改,非常安全。

内容的提问来源于stack exchange,提问作者Jonathan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:11:56