C#如何实现无需为每个方法写switch的多生产系统API适配层?
解决方案
核心思路:抽象统一接口 + 适配类实现
该方案完全规避反射,性能和原生直接调用一致,无需为每个方法编写switch分支,后续新增API或新增生产系统都可快速扩展。
第一步:定义公共统一接口
把需要对外暴露的通用方法全部定义在该接口中:
public interface IVehicleService { T GetVehicle(int id); int GetWheels(int id); // 后续新增通用方法直接在这里补充定义即可 }
第二步:为两个生产系统编写适配实现类
每个适配类负责把对应系统的原生API,转换为接口要求的统一方法签名:
// 商用车辆系统适配类 public class CommercialVehicleAdapter : IVehicleService { private readonly HeavyVehicle _heavyVehicle = new HeavyVehicle(); public T GetVehicle(int id) { return _heavyVehicle.GetTruck(id); } public int GetWheels(int id) { return _heavyVehicle.GetWheels(id); } } // 民用车辆系统适配类 public class ResidentialVehicleAdapter : IVehicleService { private readonly LightVehicle _lightVehicle = new LightVehicle(); public T GetVehicle(int id) { return _lightVehicle.GetCar(id); } public int GetWheels(int id) { return _lightVehicle.GetWheels(id); } }
第三步:简化中间转换层实现
中间层不需要再为每个方法编写switch分支,只需要在切换系统类型时替换对应的接口实例即可:
public class DoStuffWithVehicles { private IVehicleService _currentService; private TypesOfVehicles _typeOfVehicle; public TypesOfVehicles TypeOfVehicle { get => _typeOfVehicle; set { _typeOfVehicle = value; // 切换系统类型时替换对应服务实例 _currentService = value switch { TypesOfVehicles.Commercial => new CommercialVehicleAdapter(), TypesOfVehicles.Residential => new ResidentialVehicleAdapter(), _ => throw new NotSupportedException("不支持的车辆系统类型") }; } } // 所有通用方法直接转发给当前服务实例,不需要单独处理分支 public T GetVehicle(int id) => _currentService.GetVehicle(id); public int GetWheels(int id) => _currentService.GetWheels(id); // 后续新增通用方法仅需加一行转发代码即可 }
方案优势
- 性能无损耗:所有调用都是直接的虚方法调用,性能远高于反射实现,完全满足每秒数百次事务的性能要求
- 维护成本低:新增通用API时,仅需要在接口加定义、两个适配类加实现、中间层加一行转发即可,不需要修改原有逻辑
- 扩展性强:后续新增第三个生产系统时,仅需新增一个适配类实现接口,在
TypeOfVehicle的赋值逻辑中加一个分支即可,原有代码无需改动 - 符合开闭原则:对扩展开放,对修改关闭
注:原示例代码中
LightVehicle类的GetWheels方法返回值写错为T、参数名存在id和vehicleId不统一的问题,实际开发时需要修正。
内容的提问来源于stack exchange,提问作者Benjamin Kleynhans
相关产品推荐
相关产品推荐

