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

泛型数据生成器遍历返回适配及仓储模式选型咨询

技术方案梳理与解答

一、遍历生成器并收集带ID数据的实现调整

首先需要调整IDataGenerator接口设计,解决不同返回类型生成器的统一管理问题,同时实现数据附带CycleId的需求:

1. 定义接口层次

先创建非泛型基接口用于统一存储,再通过泛型接口实现强类型数据生成:

// 非泛型基接口,用于统一管理不同类型的生成器
public interface IDataGenerator
{
    object GenerateData();
    Type DataType { get; } // 标记数据类型,用于后续检索
}

// 泛型接口,提供强类型生成方法
public interface IDataGenerator<T> : IDataGenerator
{
    new T GenerateData();
}

2. 实现生成器类

以GPS和Fuel生成器为例,强类型实现泛型接口:

public class GPSDataGenerator : IDataGenerator<Dictionary<int, double>>
{
    public Dictionary<int, double> GenerateData()
    {
        // 写入具体数据生成逻辑
        return new Dictionary<int, double>();
    }

    // 显式实现非泛型接口,适配统一调用
    object IDataGenerator.GenerateData() => GenerateData();
    public Type DataType => typeof(Dictionary<int, double>);
}

public class FuelDataGenerator : IDataGenerator<int>
{
    public int GenerateData()
    {
        // 写入具体数据生成逻辑
        return 0;
    }

    object IDataGenerator.GenerateData() => GenerateData();
    public Type DataType => typeof(int);
}

3. 实现带CycleId的数据收集

修改GenerateData方法,生成附带CycleId的统一记录结构:

// 定义带检索ID的数据记录结构
public class GeneratedRecord
{
    public int CycleId { get; set; }
    public Type DataType { get; set; }
    public object Data { get; set; }
}

private List<IDataGenerator> _dataGenerators = new List<IDataGenerator>();

public IEnumerable<GeneratedRecord> GenerateData(int cycleId)
{
    foreach (var generator in _dataGenerators)
    {
        yield return new GeneratedRecord
        {
            CycleId = cycleId,
            DataType = generator.DataType,
            Data = generator.GenerateData()
        };
    }
}

二、仓储模式的适用性判断

CarGeneratorRepository负责生成器的添加/管理、生成数据的存储与检索,这个场景非常适合使用仓储模式:

  • 仓储模式封装了数据操作细节,上层Car类无需关心生成器和数据的存储介质(内存、数据库等);
  • 统一的操作接口(Add、Generate、Retrieve)让业务逻辑更清晰,后续修改存储实现时不会影响上层代码;
  • 符合单一职责原则,仓储专注于数据访问与管理,Car类专注于业务逻辑。

三、新增TirePresureDataGenerator的可行性

完全可行,且符合开闭原则:

  1. 实现泛型接口IDataGenerator<Dictionary<int, MyValue>>:
public class TirePresureDataGenerator : IDataGenerator<Dictionary<int, MyValue>>
{
    public Dictionary<int, MyValue> GenerateData()
    {
        // 写入胎压数据生成逻辑
        return new Dictionary<int, MyValue>();
    }

    object IDataGenerator.GenerateData() => GenerateData();
    public Type DataType => typeof(Dictionary<int, MyValue>);
}
  1. 通过CarGeneratorRepository的Add方法将其加入生成器列表即可,无需修改现有任何业务代码。

内容的提问来源于stack exchange,提问作者H. Ivanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 15:35:27