如何在c#中强制方法执行顺序

Abo*_*azl -1 c# design-patterns functional-programming

长话短说,我有以下课程:

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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是强迫程序员首先调用Push方法,然后让他们访问Trigger方法,在这种情况下不允许以下场景

var pipeline=new FlowBasePipeline<MyStepResult>();
pipeline.Trigger()// Trigger method is not recognized
Run Code Online (Sandbox Code Playgroud)

我们应该首先调用Push方法

var pipeline=new FlowBasePipeline<MyStepResult>();
pipeline.Push(new MyStep()).Trigger()//Now Trigger is recognized
Run Code Online (Sandbox Code Playgroud)

我所做的:

我按如下方式应用了显式接口方法实现以使其工作:

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;
                        }
        
                    }
                }
    }
Run Code Online (Sandbox Code Playgroud)

现在它运行良好,我们无法在Trigger方法之前访问Push方法,但从我的角度来看,这不是一个好方法,因为我们可能需要更多级别的订单,我不知道如何以这种方式完成。

据我所知,方法链是函数式编程的关键规则之一。

是否有任何模式或策略来实现这种链接?

更新

我们需要多次调用 push 方法

var pipeline=new FlowBasePipeline<MyStepResult>();
pipeline.Push(new MyStep1()).Push(new MyStep2()).Trigger();
Run Code Online (Sandbox Code Playgroud)

第一次推动后,推动和触发将可用。

Eri*_*ips 6

一种方法是使用接口通过指定接口作为结果来限制对特定方法的访问。

public interface IStartCar
{
  IDriveCar Start(string key);
}

public interface IDriveCar
{
  IParkCar Drive(string address);
}

public interface IParkCar
{
  IStopCar Park();
}

public interface IStopCar
{
  IParkCar Drive(string address);
  void Stop();
}

public class Car : IStartCar, IDriveCar, IParkCar, IStopCar
{
  public IDriveCar Start(string key);
  public IParkCar Drive(string address);
  public IStopCar Park();
  public IStopCar Park();

  private Car() { }

  public static IStartCar Get()
  {
    var result = new Car();
    return result;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在要使用 CarFactory 方法获取汽车Get(),它返回汽车,但您实际上只能访问接口结果。此模式仅允许开发人员将特定方法串在一起:

var car = Car.Get();
car.Start("key").Drive("address1").Park().Drive("address2").Park().Stop();
Run Code Online (Sandbox Code Playgroud)