我需要一些有关 Rhino ETL 框架管道的帮助。
必需是一种操作链接,它,
- 允许分支,
- 顺序操作(逐行),
- 将原始输入行返回到进入分支的管道。
A - B / | \ A - A - C - A \ | / 广告[]
1.注册/部分注册
要求 b.) 包含在通常的 Register(...) 和 Partial.Register(...) 初始化中,但通过设计,这会将转换后的行返回到管道
Register(new ExampleProduce<ClassA>());
Register(Partial
.Register(new ExampleConvertTo<ClassB>())
.Register(new ExampleOperateWith<ClassB>()));
// wrong row: B
Register(Partial
.Register(new ExampleConvertTo<ClassC>())
.Register(new ExampleOperateWith<ClassC>()));
// wrong row: C
Register(Partial
.Register(new ExampleConvertTo<IList<ClassD>>())
.Register(new ExampleOperateWith<IList<ClassD>>()));
// completely other row context, multiple rows of type D
Register(new ExampleOperateWith<ClassA>());
2. 分支操作
使用 BranchingOperation 涵盖了要求 a.),但是每个分支在管道切换到另一个之前处理所有行并且永远不会返回到原始管道。
Register(new ExampleProduce<ClassA>());
// runs every branch for all rows before switching to the next one
Register(new BranchingOperation()
.Add(Partial.Register(new ExampleConvertTo<ClassB>())
.Register(new ExampleOperateWith<ClassB>()))
.Add(Partial.Register(new ExampleConvertTo<ClassC>())
.Register(new ExampleOperateWith<ClassC>()))
.Add(Partial.Register(new ExampleConvertTo<IList<ClassD>>())
.Register(new ExampleOperateWith<IList<ClassD>>())));
// never reaches
Register(new Deploy<ClassA>());
3.缓存行
解决该问题的肮脏(并且在我的场景中不起作用)的可能性:将当前行保存在“分支”之前的列中并在之后恢复它。这取决于分支中的每个操作都不会更改存储原始行的列,至少在示例的最后一个分支中这是不可能的。
Register(new ExampleProduce<ClassA>());
Register(new StoreToRow<ClassA>());
Register(Partial
.Register(new ExampleConvertTo<ClassB>())
.Register(new ExampleOperateWith<ClassB>()));
Register(new RestoreFromRow<ClassA>());
Register(new StoreToRow<ClassA>());
Register(Partial
.Register(new ExampleConvertTo<ClassC>())
.Register(new ExampleOperateWith<ClassC>()));
Register(new RestoreFromRow<ClassA>());
Register(new StoreToRow<ClassA>());
Register(Partial
.Register(new ExampleConvertTo<IList<ClassD>>())
.Register(new ExampleOperateWith<IList<ClassD>>()));
Register(new RestoreFromRow<ClassA>());
// completely other "row context", multiple rows of type D
Register(new ExampleOperateWith<ClassA>());
是否有满足这些要求的 BranchingOperation(如 SequentialBranchingOperation...?)的任何实现?或任何其他想法如何解决该问题?