从并行扩展额外创建扩展的管道

本文关键字:扩展 管道 创建 并行 | 更新日期: 2023-09-27 18:14:29

我真的很喜欢使用并行扩展插件,但必须承认,当谈到为Fluent编程方法创建扩展时,我仍然发现自己面临挑战。

我有一个特殊的需求,给定这个简单的BusinessEntity遵循Null对象模式

public abstract class BusinessEntity
{
    public static readonly BusinessEntity Null = new NullBusinessEntity();
    public long EntityKey { get; set; }
    private class NullBusinessEntity : BusinessEntity
    {
    }
}

我如何创建一个"有条件的下一步"步骤,它只在满足条件时执行函数体?

现在我是这样做的:

Func<BusinessEntity, Func<BusinessEntity,BusinessEntity>, BusinessEntity> conditional = (be, func) =>
{
    if (be.Equals(BusinessEntity.Null)) return be;
    return func.Invoke(be);
};

然后在管道中像这样调用它:

Pipeline<BusinessEntity, string> pipeline = Pipeline.Create<BusinessEntity, BusinessEntity>(CheckEntity)
    .Next<BusinessEntity>(be => conditional.Invoke(be, entity => ProcessEntity(be)))
    .Next<string>(FinalResult);

是否有一种方法来创建管道的扩展,特定于我的BusinessEntity(或不),这将允许我这样调用它:

Pipeline<BusinessEntity, string> pipeline = Pipeline
    .Create<BusinessEntity, BusinessEntity>(CheckEntity)
    .ConditionalNext<BusinessEntity>(ProcessEntity)
    .Next<string>(FinalResult);

这可能吗?

从并行扩展额外创建扩展的管道

如果您想为此做一个有条件的null的通用扩展,您只需要编写一个扩展方法,使用conditional lambda调用Next(),如:

public static Pipeline<TInput, TNextOutput>
    ConditionalNext<TInput, TOutput, TNextOutput>(
    this Pipeline<TInput, TOutput> pipeline, Func<TOutput, TNextOutput> func)
    where TOutput : class
    where TNextOutput : class
{
    return pipeline.Next(x => x == null ? null : func(x));
}

null对象模式的问题是它在泛型方法中不可用,所以你必须使它特定于你的类型:

public static Pipeline<TInput, BusinessEntity> ConditionalNext<TInput>(
    this Pipeline<TInput, BusinessEntity> pipeline,
    Func<BusinessEntity, BusinessEntity> func)
{
    return pipeline.Next(x => x.Equals(BusinessEntity.Null) ? x : func(x));
}

在这两种情况下,用法如下:

var pipeline = Pipeline.Create<BusinessEntity, BusinessEntity>(CheckEntity)
    .ConditionalNext(ProcessEntity)
    .Next(FinalResult);