我不想重新发明轮子。
是否有适合以下工作流程的设计模式或模式。想法是有一个适合所有人的通用解决方案:加载数据->转换它->写入转换的
喜欢:
(1) LOAD DATA : 从 DataSource 加载数据并产生一个 IEnumerable
(2) COVNERT LOADED DATA - 遍历加载的数据,并根据转换逻辑将它们转换为 TConverted 类型
(3) WRITE CONVERTED DATA - 遍历 IEnumerable 并将每个项目写入 .txt 文件
我不想重新发明轮子。
是否有适合以下工作流程的设计模式或模式。想法是有一个适合所有人的通用解决方案:加载数据->转换它->写入转换的
喜欢:
(1) LOAD DATA : 从 DataSource 加载数据并产生一个 IEnumerable
(2) COVNERT LOADED DATA - 遍历加载的数据,并根据转换逻辑将它们转换为 TConverted 类型
(3) WRITE CONVERTED DATA - 遍历 IEnumerable 并将每个项目写入 .txt 文件
“模板方法”模式可以帮助您构建一个通用框架,该框架可用于为不同类型的数据实现此过程。会有一个像这样的抽象基类:
public abstract class ETLProcess {
public final runETL() {
IEnumerable rawData = extract();
IEnumerable tranformedData = transform(rawData);
load(transformedData);
}
protected abstract IEnumerable extract();
protected abstract IEnumerable transform(IEnumerable rawData);
protected abstract load(IEnumerable transformedData);
}
然后你可以通过扩展ETLProcess
类来实现不同类型数据的处理。这种模式的优点是您可以在抽象类中定义您的流程,而在具体类中定义各个步骤。您可以将通用代码、通用错误处理等放在基类中。
我相信管道模式在 MSDN 上具有良好的C# .NET 4.0 实现。
这个想法是提取阶段,并为每个阶段安排一个 TPL 的新实例Task
,然后通过实例将所有这些实例联系在一起BlockingCollection<T>
作为中间缓存。
还值得注意的是,在引用的 MSDN 论文BlockingCollection.GetConsumingEnumerable()中提到的会根据需要返回IEnumerable<T>
。
一般流程示例:
我相信您正在寻找适配器模式。我经常将转换视为既不偏向客户也不偏向适应者的中间阶层。包装器的想法并不总是“感觉”很抽象。但是,最好还是编写专门设计的类,以使传入的数据适应客户的期望。如果您觉得它违反了您的抽象,请考虑创建基类或接口并针对传入数据的细节实现它们。