从并行扩展额外创建扩展的管道
本文关键字:扩展 管道 创建 并行 | 更新日期: 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);