能否扩展partial(分部)类中的非分部方法以插入自定义逻辑?
方案1:装饰器模式(无需修改自动生成代码,优先推荐)
该方案完全不会触碰自动生成的代码内容,后续代码重新生成也不会覆盖自定义逻辑,是适配自动生成类扩展的最优选择。利用PartialClass已经实现的IPartialInterface接口,做一层逻辑包裹即可:
// 自定义装饰器,实现和目标类相同的接口 public class PartialClassDecorator : IPartialInterface { private readonly IPartialInterface _originalInstance; // 注入原PartialClass的实例 public PartialClassDecorator(IPartialInterface originalInstance) { _originalInstance = originalInstance; } public async Task<object> Method(string param) { // 此处插入自定义业务逻辑 bool isAllowExecuteOriginal = CheckCustomLogic(param); if (!isAllowExecuteOriginal) { // 自定义逻辑校验不通过,直接终止流程返回结果 return new { Status = "Fail", Msg = "校验不通过" }; } // 校验通过,执行原有逻辑 return await _originalInstance.Method(param); } // 你的自定义业务逻辑实现,返回true代表继续执行原有逻辑,false代表终止 private bool CheckCustomLogic(string param) { return param.Length >= 6; } }
使用时只需要把原来直接创建PartialClass实例的逻辑替换为装饰器包裹即可:
// 原有写法:var service = new PartialClass(); // 替换为: var service = new PartialClassDecorator(new PartialClass()); // 后续调用service.Method就会自动执行自定义扩展逻辑
如果是用依赖注入的场景,直接修改服务注册的实现即可,业务侧的调用代码完全不需要改动。
方案2:Partial方法钩子(可控制自动生成模板时选用)
如果你有权限调整自动生成PartialClass的代码模板,可以用partial方法实现扩展,对外使用完全无感知:
- 先在你自己手写的partial类扩展部分定义并实现钩子方法:
// 自己编写的partial扩展部分,不会被自动生成覆盖 public partial class PartialClass { // 定义partial前置钩子方法 partial void PreMethodExecute(string param, out bool canContinue); // 实现钩子方法,若不需要扩展也可以删除该实现,编译器会自动忽略对该方法的调用 partial void PreMethodExecute(string param, out bool canContinue) { // 自定义业务逻辑 canContinue = !string.IsNullOrWhiteSpace(param); } }
- 修改自动生成代码的模板,在原
Method方法的开头插入钩子调用逻辑:
// 调整模板后的自动生成代码 public partial class PartialClass : IPartialInterface { public Task<object> Method(string param) { // 新增钩子调用 PreMethodExecute(param, out var canContinue); if (!canContinue) { // 终止执行,返回自定义结果 return Task.FromResult<object>(null); } // 原有逻辑 // does stuff } }
该方案的优势是业务侧不需要修改实例创建逻辑,完全透明,但必须保证自动生成的模板已经插入了钩子调用,否则重新生成代码时自定义的调用逻辑会被覆盖。
内容的提问来源于stack exchange,提问作者Emil Aleksandrov
相关产品推荐
相关产品推荐

