2012-04-09 13 views
0

私たちはアプリでイベントソースを使用しており、多くのオブジェクトの変更を開始したユーザーを追跡する必要があります。現在、我々はこのようにしている私たちの方法の中で最もので、このドメインオブジェクトのセッションへのアクセス

class Order { 
    setNameBy(newname, User user) { 
    applyChange(new OrderRenamed(user.id, newname)); 
    } 
    : 
} 

のようなコードを持っており、それらのすべては、私たちは、ドメインオブジェクト内のSessionContextにアクセスして考えて、この

setNameBy("a new name", SessionContext.currentUser) 

のように呼ばれています。すなわち:それは一方で、より自然なシームとして

setNameBy(newname, User user) { 
    applyChange(new OrderRenamed(user.id, newname)); 
} 

setName(newname) { 
    applyChange(new OrderRenamed(SessionContext.currenUser.id, newname)); 
} 

なる私が個人的には、ドメインオブジェクト内のSessionContextにアクセスするために少し厄介な感じ後メソッドシグネチャを好みます。

このように、DDD/CQRSアプリではどのようにセッションデータを処理するのが最適ですか?ドメインオブジェクトのSessionContextにアクセスすることはできますか?または、イベントの豊富化などの他のメソッドを使用して、ドメインから発行されたイベントにこの情報を追加する必要がありますか?

答えて

2

変更を開始したユーザーを頻繁に追跡する場合、SessionContextはソリューションの固有の部分になり、したがってIMOは最小限の抵抗(十分な解決策)のパスになります。おそらく、UserContextへの言い回しは、「汚い」技術的結合のように聞こえることはありませんか? :)

私はしばしば私のアプリケーション(イベントソースでもなくても)でスレッドバインドコンテキストを使用し、SessionContextがスレッドにバインドされていない場合にSessionContext.currentUserが例外をスローすると、テスト中にバグを見つけ出すのに役立ちます(少なくとも私にはあります)。

これに代わる方法として、イベントをユーザーのトラッキング(インターフェースなど)が必要なものとしてマークし、その後イベントを豊かにすることができます。これはちょっと面倒ですが、User情報を必要とするビジネス関数の外で、バインドされていないSessionContext例外が発生する可能性があるため、問題解決を難しくする可能性があります。

両方のソリューションは十分に優れたソリューションであるため、主にSessionContextとの結合の必要性があります。

2

私のドメインモデルは外部の詳細を完全に知らないようにしておくことをお勧めします。あなたのドメインオブジェクトがビジネスルールを実施するためにユーザーIDを必要とする場合、私はあなたの現在のアプローチを使用し、Userを引数として送信します。追跡/監査の目的でユーザーIDだけが必要な場合は、イベントを充実させることができます。

関連する問題