泛型数据生成器遍历返回适配及仓储模式选型咨询
技术方案梳理与解答
一、遍历生成器并收集带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的可行性
完全可行,且符合开闭原则:
- 实现泛型接口
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>); }
- 通过CarGeneratorRepository的Add方法将其加入生成器列表即可,无需修改现有任何业务代码。
内容的提问来源于stack exchange,提问作者H. Ivanov
相关产品推荐
相关产品推荐

