【发布时间】:2021-08-13 08:38:39
【问题描述】:
长话短说,我有以下课程:
public class FlowBasePipeline<T>
{
private List<StepBaseBusiness<T>> stepList = new List<StepBaseBusiness<T>>();
public void Push(StepBaseBusiness<T> step)
{
stepList.Add(step);
}
public void Trigger(T result)
{
foreach (var step in stepList )
{
result = step.Execute(result);
if (!result.IsSuccess)
{
break;
}
}
}
}
我正在寻找的是强制程序员首先调用Push 方法,然后让他们访问Trigger 方法,在这种情况下,以下情况是不允许的
var pipeline=new FlowBasePipeline<MyStepResult>();
pipeline.Trigger()// Trigger method is not recognized
我们应该先调用Push方法
var pipeline=new FlowBasePipeline<MyStepResult>();
pipeline.Push(new MyStep()).Trigger()//Now Trigger is recognized
我做了什么:
我应用了如下显式接口方法实现以使其工作:
public interface IBasePipeline<T> where T:BaseResult,new()
{
void Trigger();
IBasePipeline<T> Push(StepBaseBusiness<T> step);
}
public class FlowBasePipeline<T>:IBasePipeline<T> where T:BaseResult,new()
{
private List<StepBaseBusiness<T>> stepList = new List<StepBaseBusiness<T>>();
public IBasePipeline<T> Push(StepBaseBusiness<T> step)
{
stepList.Add(step);
return this;
}
void IBasePipeline<T>.Trigger(T result)
{
foreach (var step in stepList )
{
result = step.Execute(result);
if (!result.IsSuccess)
{
break;
}
}
}
}
现在它运行良好,我们无法在 Push 方法之前访问 Trigger 方法,但从我的角度来看,这不是一个好方法,因为我们可能需要更多级别的订单,我不知道怎么做可以通过这种方式完成。
据我所知,方法链是函数式编程的关键规则之一。
是否有任何模式或策略来实现这种链接?
更新:
我们需要多次调用push方法
var pipeline=new FlowBasePipeline<MyStepResult>();
pipeline.Push(new MyStep1()).Push(new MyStep2()).Trigger();
第一次推送后,推送和触发即可。
【问题讨论】:
-
让
Push返回带有Trigger方法的东西。 -
作为旁注,您能重新格式化您的代码吗?我怀疑它在 Visual Studio 中看起来不像这样,并且在所有地方都像这样缩进,真的很难阅读。
-
您可以尝试考虑构建器模式。调用 build() 方法将返回最终的对象,您可以使用它来调用 trigger
-
这真的它在 Visual Studio 中的样子吗?我会很惊讶。例如,在前两行中......您的类声明真的与
stepList的声明处于同一缩进级别吗?如果它在 Visual Studio 中的格式也很糟糕,我会让 VS 重新格式化它以开始......然后确保它在这里看起来不错。花时间让帖子中的代码看起来尽可能可读总是值得的...通读帖子并问自己如果您回答问题。 -
如果您想了解更多有关此类设计问题的信息,请参阅“时间耦合”。
标签: c# design-patterns functional-programming