Я впервые пытаюсь разработать приложение DDD.
У меня есть класс сущностей, который может иметь несколько состояний и имеет правила, которым нужно следовать для перехода из одного состояния в другое. У меня есть словарь, где ключи - это состояния, в которые может переходить объект, а значения - это состояния, из которых можно переходить из состояния:
protected static readonly IDictionary<State, State[]> aGoodName = new Dictionary<State, State[]>
{
{ State.Approved, new State[] { State.Requested } },
{ State.Standardized, new State[] { State.Approved } },
{ State.Queued, new State[] { State.Standardized, State.Succeeded, State.Failed } },
{ State.Running, new State[] { State.Queued } },
{ State.Succeeded, new State[] { State.Running } },
{ State.Failed, new State[] { State.Running } },
{ State.Completed, new State[] { State.Succeeded } },
{ State.Canceled, new State[] { State.Requested, State.Approved, State.Standardized, State.Succeeded, State.Failed, State.Queued } }
};
У меня есть один универсальный метод, который имеет желаемое состояние в качестве параметра и проверяет, можно ли переходить из него:
public void Transition(State state)
{
if (!aGoodName[state].Contains(State))
{
throw new ArgumentException($"Cannot change state from {State.ToString()} to {state.ToString()}.");
}
State = state;
}
Однако, если я правильно понимаю, способ DDD состоит в том, чтобы выразить код домена на языке, который понятен как разработчикам, так и деловым людям, поэтому, например, было бы более разумно иметь метод, скажем, для преемственности:
public void Succeed()
{
Transition(State.Succeeded);
}
Или даже:
public void Succeed()
{
var states = new List<State> { State.Running };
if (!states.Contains(State))
{
throw new ArgumentException($"Cannot change state from {State.ToString()} to {State.Succeeded.ToString()}.");
}
State = State.Succeeded;
}
Я довольно новичок в этом шаблоне проектирования и хотел бы знать, какой из вышеуказанных подходов наиболее подходит для DDD.