エンティティの状態の変更に関連するタスクがあります。CQRS
そして、それが何かを含むイベントベースのアプローチであるべきか、それともa を使用しState pattern
てすべてのロジックをエンティティ内に残すことができるかについて、私はかなり混乱しています。
State パターンを使用するドメイン モデル (またはその一部) を示す記事を見つけました: http://www.prowareness.com/blog/?p=1448
注文システムは、私のドメイン モデルに非常に近いものです。だから例は素晴らしいです。しかし、MVCパターンを考慮した良い習慣であり、実装できるかどうか疑問に思っていRavenDB/NHibernate
ますか?
編集:質問の再考
例に従ってみましょう:
まず、 というドメイン エンティティを次に示します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
それ自体に変化があれば、それに応じてすべてが変化します。
ありがとう!