我正在尝试抽象一组模块以在多个管道中使用它们。 在我的第一个管道之前,我有这个。
IModule[] textReplacement = new IModule[] {
Replace(" -- ", "—"),
Replace("--", "—"),
Trace("Text replacement performed...")
};
然后,在管道中:
Pipelines.Add("Pages",
ReadFiles("*.md"),
Concat(textReplacement),
WriteFiles("*.html)
);
当我执行时,Text replacement performed...
被写入控制台,因此执行流正在通过这两个模块工作。然而--
实际上不会发生文本替换。 (或者,如果是这样,它不会保留在继续沿管道运行的文档中。
空文档将添加到文档集中。
Concat
的文档明确指出:
指定的模块使用空的初始文档执行,然后输出原始输入文档,无需修改,并与指定模块序列的结果连接。
我只是不知道为什么会这样,为什么需要或有帮助,或者如何摆脱它。 我不能在我的文档集中浮动空文档,否则会导致后续管道中出现错误。
这里的诀窍是使用 LINQ .Concat()
方法形成一个数组,该数组由特定于每个管道的模块与在管道之前声明的公共模块数组(示例中textReplacement
(组成。这是有效的,因为IPipelineCollection.Add()
接受params IModule[]
数组。
IModule[] textReplacement = new IModule[] {
Replace(" -- ", "—"),
Replace("--", "—"),
Trace("Text replacement performed...")
};
Pipelines.Add("Pages",
new[]
{
// Modules before the common set
ReadFiles("*.md")
}
.Concat(textReplacement) // The common set
.Concat(new[]
{
// Modules after the common set
WriteFiles("*.html)
})
.ToArray()
);
当然,这很尴尬。当然,除了使用 .Concat()
之外,还有其他方法可以创建单个数组以馈送到IPipelineCollection.Add()
。例如,您可以使用 List<T>.Add()
和 List<T>.AddRange()
在每个管道之前创建一个List<IModule>
来创建模块的聚合序列,然后在创建管道时将其转换为数组。您还可以编写一个扩展方法,该方法知道如何将多个序列连接成单个数组。
引入一个名为Modules
的特殊模块,这将变得更加容易,该模块专门为此目的而设计,该模块充当子模块(https://github.com/Wyamio/Wyam/issues/197(的容器:
Modules textReplacement = Modules(
Replace(" -- ", "—"),
Replace("--", "—"),
Trace("Text replacement performed...")
);
Pipelines.Add("Pages",
ReadFiles("*.md"),
textReplacement,
WriteFiles("*.html)
);