エンティティの状態が変更されているタスクがあります。そして、私はそれがCQRS
のようなものを含むイベントベースのアプローチか、State pattern
を使用してエンティティの内部にすべてのロジックを残すことができるかどうかを考えるのはかなり混乱しています。ステートパターンを組み込んだドメインモデルを使用する
私は、Stateパターンを使用してドメインモデル(またはその一部)を示している記事を見つけました:http://www.prowareness.com/blog/?p=1448
オーダリングシステムは、私のドメインモデルに非常に近いです。したがって、この例は素晴らしいです。しかし、まだ私はそれがMVCパターンを考慮して良い練習であるかどうか、RavenDB/NHibernate
で実装することが可能かどうか疑問に思っていますか?
EDIT:質問はのは一例に従ってみましょう
を再考:
まず、ここではドメインエンティティはIdea
と呼ばれています:
[Serializable]
public class Idea : AbstractEntity<Guid> {
private static IStateFactory stateFactory;
private AbstractState state = new InitiatedState();
[Required, StringLength(150)]
public String Title { get; set; }
[Required]
public String ProblemContext { get; set; }
public DateTime CreatedOn { get; set; }
public Guid InitiatorId { get; set; }
[Required]
public Decimal InvestmentAmount { get; set; }
public Boolean IsInitiated {
get { return this.state.IsInitiated; }
}
public Boolean IsRejected {
get { return this.state.IsRejected; }
}
public Boolean IsUnderInitialAssessment {
get { return this.state.IsUnderInitialAssessment; }
}
public Boolean IsConfirmedForImplementation {
get { return this.state.IsConfirmedForImplementation; }
}
}
AbstractState
に対し次のとおりです。
public abstract class AbstractState {
public virtual Boolean IsInitiated {
get { return true; }
}
public virtual Boolean IsRejected {
get { return false; }
}
public virtual Boolean IsUnderInitialAssessment {
get { return false; }
}
public virtual Boolean IsConfirmedForImplementation {
get { return false; }
}
}
および状態ファクトリインタフェースは、このように定義されています
public interface IStateFactory {
AbstractState GetState(String state);
}
最終的な思考は、メソッドを置くことです:
public void AlterState(String stateString) {
this.state = stateFactory.GetState(stateString);
}
- は大丈夫なデザインですか?問題となるのは何ですか?
- 拡張性はどうですか?私の見解から、独自の州の工場を拡張/実装することができます。しかし、
AbstractState
に変更がある場合は、それに応じてすべてが変更されます。
ありがとう!
はい、私はかなり興味があります))! – lexeme