如何为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
相关产品推荐
相关产品推荐

