C#点击按钮实现英制与公制单位转换及业务逻辑层设计
单位转换复用方案:接口与业务逻辑层设计
1. 定义通用单位转换接口
先抽象转换能力,让不同业务逻辑层可依赖该接口,提升扩展性与灵活性:
public interface IUnitConverter { /// <summary> /// 执行单位转换 /// </summary> /// <param name="dimension">维度(如LENGTH、VOLUME)</param> /// <param name="inputUnit">输入单位</param> /// <param name="outputUnit">输出单位</param> /// <param name="inputValue">输入值</param> /// <returns>转换后的值</returns> double Convert(string dimension, string inputUnit, string outputUnit, double inputValue); }
2. 基于现有工具类实现转换服务
把已有的静态方法封装成接口实现,让业务层可通过依赖注入使用,降低耦合:
public class DefaultUnitConverter : IUnitConverter { public double Convert(string dimension, string inputUnit, string outputUnit, double inputValue) { // 直接复用已验证的静态转换方法 return YourUtilityClass.UnitConversionCalculation(dimension, inputUnit, outputUnit, inputValue); } }
3. 为业务对象创建业务逻辑层
以编辑窗口对应的ProductDimension业务对象为例,创建专属服务处理其单位转换:
public class ProductDimensionService { private readonly IUnitConverter _unitConverter; // 构造注入依赖,方便后续替换实现或编写单元测试 public ProductDimensionService(IUnitConverter unitConverter) { _unitConverter = unitConverter; } /// <summary> /// 将产品尺寸从英制(in)转换为公制(mm) /// </summary> /// <param name="imperialDimensions">英制尺寸对象</param> /// <returns>公制尺寸对象</returns> public ProductDimension ConvertToMetric(ProductDimension imperialDimensions) { var metricDimensions = new ProductDimension(); // 转换长度属性 metricDimensions.Length = _unitConverter.Convert("LENGTH", "IN", "MM", imperialDimensions.Length); metricDimensions.LengthUnit = "mm"; // 转换宽度属性 metricDimensions.Width = _unitConverter.Convert("LENGTH", "IN", "MM", imperialDimensions.Width); metricDimensions.WidthUnit = "mm"; // 按需处理其他尺寸属性 if (imperialDimensions.HeightUnit?.Equals("in", StringComparison.OrdinalIgnoreCase) ?? false) { metricDimensions.Height = _unitConverter.Convert("LENGTH", "IN", "MM", imperialDimensions.Height); metricDimensions.HeightUnit = "mm"; } return metricDimensions; } }
4. 界面按钮触发逻辑
在编辑窗口的Metric Values按钮点击事件中,调用业务服务完成转换并更新界面:
private void MetricValuesButton_Click(object sender, EventArgs e) { // 实际项目建议通过依赖注入容器获取实例,此处为示例直接初始化 var unitConverter = new DefaultUnitConverter(); var dimensionService = new ProductDimensionService(unitConverter); // 从界面获取当前英制尺寸数据 var imperialDimensions = new ProductDimension { Length = double.Parse(txtLength.Text), LengthUnit = lblLengthUnit.Text, Width = double.Parse(txtWidth.Text), WidthUnit = lblWidthUnit.Text // 补充其他需要转换的属性 }; // 执行转换 var metricDimensions = dimensionService.ConvertToMetric(imperialDimensions); // 更新界面控件 txtLength.Text = metricDimensions.Length.ToString("F2"); lblLengthUnit.Text = metricDimensions.LengthUnit; txtWidth.Text = metricDimensions.Width.ToString("F2"); lblWidthUnit.Text = metricDimensions.WidthUnit; // 同步更新其他尺寸控件 }
方案优势
- 复用性:所有需要单位转换的界面都可复用
IUnitConverter与对应业务服务,避免重复代码 - 可维护性:转换逻辑集中管理,后续修改只需调整工具类或服务实现,所有调用处自动生效
- 可测试性:依赖接口设计,便于编写单元测试模拟转换场景
内容的提问来源于stack exchange,提问作者user2137622
相关产品推荐
相关产品推荐

