2010-12-06 1 views
1

私は、Nservicebusを計算し、合理的に大規模な(少なくとも私にとっては)アプリを計画する最初のステップを実行しています。Nservicebusシングルトンパターン - 現在存在するオブジェクトへのフック

私はアプリをXマシンにスケールアウトできるようにしたい。 ...

クライアントがWCFを介してサーバに話すでしょう

LogonService UserManagementService GameService RoomService など:それは、次のようなサービスの数を、持っています。サービス自体は、NServiceBusとMSMQを介して互いに話し合います。 Sacha Barber has written an excellent articleはNServiceBusを使い始めていて、私が狙うのと同じ状況に立ち向かっています。このhereについては、UdiとSachaの間にさらにチャットがあります。

私の質問は、サービスがメッセージを処理しているときに、そのサービスの残りのアプリケーションについてどのように知っていますか? Sachaが書いているように、メッセージが処理される必要があるときには、 "ハンドラは自動的に"表示されます。だから、これが作成されると、既に起動している他のオブジェクトについてどうやって知っているのでしょうか?たとえば、GameServiceでは、現在実行中のすべてのゲームのリストがあります。どのようにこれにアクセスしますか?

(サシャが指摘したように)私は、私は考えることができる2つのオプションを推測、以下のとおりです。私は、私はむしろ城でシングルトンを登録すると思う2のうち

Mediatorパターン シングルトン

ウィンザーとその方法を使用します。

シングルトンのパターンを適切に使用していますか?(シングルトンを「悪魔」と呼んでいる人がよく見かけますが、可能な場合は使用したくありません)。

この問題の解決策がありますか?

ありがとうございます。

答えて

2

私はシングルトンパターンも使用します。それ以外の場合は、通常はデータストア内で状態が維持され、各メッセージが処理されるたびにハンドラによって読み取られます。

public Handle(SomeMessage msg) 
{ 
    var aggregateRoot = writeStore.Get(msg.SomeId); 

    aggregate.DoSomeAction(msg.SomeOtherData); 

    //if write store does not support dirty tracking 
    writeStore.Save(aggregateRoot); 
} 
+0

私はそれについても気分がいいです。 Thx – Jon

0

ユニットテストを他のものとやりとりしたい場合は、シングルトンはかなりひどいです。 NServiceBusは、メッセージハンドラを初期化する際に、依存関係注入フレームワークとしてSpring(デフォルト)を使用します。理想的には、自分でSpringにプラグインし、オブジェクトを登録して、それらを経由して注入できるのが理想的です。春。

シングルトンは、あなたが望むものを達成するための簡単な方法です。しかし、オブジェクトをシングルトンにする唯一の理由がNServiceBusにアクセスする唯一の理由なら、それを行うためのより良い方法を見つけることをお勧めします。

+0

こんにちはMrnye、コメントありがとう。シングルトンなしでメッセージが受信されるたびに、NServiceBusがオブジェクトの同じインスタンスをどのように取得するかについての提案はありますか?その理由は、メッセージが相互作用する必要がある状態と現在実行中のプロセスが既に存在するからです。私はdbなどに直接行くつもりはありません。再度、感謝します。 – Jon

+0

前述したように、依存性注入フレームワークを使用する必要があります。 NServiceBusは、デフォルトでSpring.Netを使用します(http://www.springframework.net/を参照)。以前は使っていませんでしたので、オブジェクトをSpringに登録する方法を検討しなければなりません。それがうまくいくと、パブリックプロパティ 'public IBus {get;セット; } 'を呼び出すと、Springはこれを見てクラスのインスタンスに自動的に値を設定します。 – mike

+0

春の代わりにキャッスルを使用しています。通常、クラスのタイプを登録し、必要なときにそのクラスの新しいインスタンスを作成します。私はそれが既に実行されているので、クラスの単一インスタンスを返す必要があります。私が理解しているように、実行中のクラスをIOCフレームワークに登録することは、シングルトンパターンと同じですが、何か不足していますか? – Jon

関連する問題