是否可将多个需求绑定至同一个RequirementHandler,是否符合SOLID原则?
问题解答
核心结论
不需要额外创建仅泛型类型不同、逻辑完全一致的RequirementHandler,直接复用通用泛型实现的方案更合理,且完全符合SOLID原则要求。
具体说明
你可以先将公共逻辑抽象为通用泛型RequirementHandler<T>,为泛型参数加上必要的类型约束后,直接将不同需求类绑定到该通用实现即可,不需要为每个需求单独创建重复逻辑的子类。
对应SOLID原则适配性验证
- 单一职责原则:通用Handler仅负责处理对应逻辑的需求,没有承载额外无关功能,符合单一职责要求。
- 开闭原则:新增同逻辑的需求时,不需要修改原有Handler的代码,仅需要新增需求类、绑定到已有泛型Handler即可完成扩展,完全符合「扩展开放、修改关闭」的要求。如果提前为每个需求创建重复逻辑的Handler,后续公共逻辑迭代时需要修改多份代码,反而违反开闭原则。
- 里氏替换原则:只要泛型约束覆盖所有绑定需求的公共约定,通用泛型Handler可以替换任意对应类型的特定Handler,不会出现逻辑异常,符合里氏替换要求。
- 接口隔离原则:通用Handler仅依赖需求类的公共抽象约定,不会强迫需求类依赖不需要的方法或属性,符合接口隔离要求。
- 依赖倒置原则:通用Handler依赖的是抽象的需求公共约定(如所有需求都实现的公共接口),而非具体的某一个需求类,符合依赖倒置要求。
特殊场景说明
如果后续某一个需求的处理逻辑需要做定制化调整,再单独继承通用泛型Handler重写对应方法即可,不需要提前预创建无定制逻辑的空实现。
代码示例(C#)
// 需求公共约定接口 public interface IBaseRequirement { int PermissionId { get; } } // 通用泛型Handler public class PermissionCheckHandler<TRequirement> : IRequirementHandler<TRequirement> where TRequirement : IBaseRequirement { private readonly IPermissionService _permissionService; public PermissionCheckHandler(IPermissionService permissionService) { _permissionService = permissionService; } public Task HandleAsync(TRequirement requirement, CancellationToken cancellationToken) { return _permissionService.CheckAsync(requirement.PermissionId, cancellationToken); } } // 依赖注入注册,直接绑定不同需求到同一个泛型实现 services.AddTransient<IRequirementHandler<CreateOrderRequirement>, PermissionCheckHandler<CreateOrderRequirement>>(); services.AddTransient<IRequirementHandler<DeleteOrderRequirement>, PermissionCheckHandler<DeleteOrderRequirement>>();
内容的提问来源于stack exchange,提问作者Bartosz Bogatynia Medycki
相关产品推荐
相关产品推荐

