7

エンティティの状態が変更されているタスクがあります。そして、私はそれが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); 
} 
  1. は大丈夫なデザインですか?問題となるのは何ですか?
  2. 拡張性はどうですか?私の見解から、独自の州の工場を拡張/実装することができます。しかし、AbstractStateに変更がある場合は、それに応じてすべてが変更されます。

ありがとう!

答えて

3

Nicholas Blumhardtの階層ステートマシンStatelessに興味があるかもしれません。この機能についてはSO answer hereをお読みください。ここにはsimple workflow processor example from my blogがあり、私は現在the Pipe and Filter patternと一緒に使っていますが、これはとてもうまく動作します。

編集

私はまた、あなたが興味を持っている場合RavenDBとステートレスを使用して実装しています。

+0

はい、私はかなり興味があります))! – lexeme

2

CQRSと状態パターンは全く異なるものです。状態パターンは、単一オブジェクトの状態または状態のセットを実装する方法を提供しますが、CQRSはアーキテクチャスタイルです。 MVCは状態パターンやCQRSとは無関係であり、プレゼンテーション層のアーキテクチャスタイルです。 NHibernateと組み合わせてステートパターンを使用することはできますが、マッピングは簡単ではなく、フィールドに基づいて適切なステートクラスにマップするカスタムIUserTypeを実装する必要があります。 RavenDBはNHibernateと非常に異なっており、マッピングはかなり簡単ですが、全く異なるデータベースシステムです。

1

管理ツールをバックアップするためにsqlを使用していて、フロントエンドが検索を実行するためにRavenDBを使用していたとします。この架空のCQRSシナリオでは、SqlからRavenDBにデータをプッシュする必要があります。

関連する問題