You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:05:39