哪种设计模式适合LOAD-CONVERT-WRITE场景?

时间:2012-10-16 12:15:33

标签: c# .net design-patterns

我不想重新发明轮子。

是否存在适合下面工作流程的设计模式。想法是拥有适合所有人的通用解决方案:LOAD DATA - > CONVERT IT - >写下转换

像:

(1) LOAD DATA :从DataSource加载数据并生成IEnumerable

(2) COVNERT LOADED DATA - 浏览加载的数据,并根据转换逻辑将它们转换为TConverted类型

(3) WRITE CONVERTED DATA - 浏览IEnumerable并将每个项目写入.txt文件

3 个答案:

答案 0 :(得分:1)

我相信Pipelines pattern在MSDN上有一个好C# .NET 4.0 implementation

我们的想法是提取阶段,并为每个阶段安排一个TPL Task的新实例,然后通过BlockingCollection<T>实例将所有实例绑定在一起作为中间缓存。

另外值得注意的是,参考MSDN论文BlockingCollection.GetConsumingEnumerable()中提到的内容可以根据需要返回IEnumerable<T>

一般流程示例:

enter image description here

答案 1 :(得分:1)

“模板方法”模式可以帮助您构建一个通用框架,可用于为不同类型的数据实现此过程。会有一个像这样的抽象基类:

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类来实现不同类型数据的过程。这种模式的优点是您可以在抽象类中定义您的过程,并在具体类中定义各个步骤。您可以将公共代码,常见错误处理等放在基类中。

答案 2 :(得分:0)

我相信你正在寻找Adapter模式。我经常把转换看作是一个既不倾向于客户也不倾向于适应者的中间阶级。包装器的想法并不总是“感觉”非常抽象。但是,编写专门用于使传入数据适应客户期望值的类仍然是最好的。如果您认为它违反了您的抽象,请考虑创建基类或接口,并针对传入数据的细节实现这些基类或接口。