«В зависимости от состояния рабочего элемента», приводит Государственный шаблон проектирования
Так или иначе, вам придется реорганизовать интерфейс и в конечном итоге разорвать клиентские контракты.
Если я правильно понял вашу проблему, значит, у вас есть WorkItemProcessor, состояние которого изменяется
на WorkItem, отправленных ему.
Поэтому ваш WorkItemProcessor становится
// Context
public class WorkItemProcessor
{
public IState CurrentState { get; set; }
public WorkItemProcessor(IState initialState)
{
CurrentState = initialState;
}
public void Process(WorkItem workItem)
{
CurrentState.Handle(this, workItem);
}
}
Затем мы определяем несколько состояний, которые WorkItemProcessor потенциально может находиться в
// State Contract
public interface IState
{
void Handle(WorkItemProcessor processor, WorkItem item);
}
// State One
public class CompleteState : IState
{
public void Handle(WorkItemProcessor processor, WorkItem item)
{
processor.CurrentState = item.CompletenessConditionHoldsTrue ? (IState) this : new CancelState();
}
}
// State Two
public class CancelState : IState
{
public void Handle(WorkItemProcessor processor, WorkItem item)
{
processor.CurrentState = item.CancelConditionHoldsTrue ? (IState) this : new CompleteState();
}
}
Предположим, ваш WorkItem выглядит как
// Request
public class WorkItem
{
public bool CompletenessConditionHoldsTrue { get; set; }
public bool CancelConditionHoldsTrue { get; set; }
}
Чтобы сложить все вместе
static void Main()
{
// Setup context in a state
WorkItemProcessor processor = new WorkItemProcessor(new CancelState());
var workItem1 = new WorkItem { CompletenessConditionHoldsTrue = true };
var workItem2 = new WorkItem { CancelConditionHoldsTrue = true };
// Issue requests, which toggles state
processor.Process(workItem1);
processor.Process(workItem2);
Console.Read();
}
Надеюсь, это приблизит вас. Приветствия.