我第一次尝试以 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。
www说
相关分类