5

電子書籍リーダーであるWebアプリケーションを作成しました。したがって、覚えておくべきことの1つは、ドメインが実際の本を読むことのドメインではないということです。現在、ユーザーがアクセスした電子書籍のページに関する情報を保存することで、ユーザーの読書行動を収集しようとしています。この情報はデータウェアハウスに送られるため、ブックコントローラーからイベントを発生させることが正しい方法であると考えました。

bus.Publish()

ただし、このイベントの消費者は実際には1人だけであり、それがビジネスインテリジェンスチームであるため、公開するか送信するかはわかりません。また、Webアプリ(http://www.make-awesome.com/2010/10/why-not-publish-nservicebus-messages-from-a-web-application)から公開することはお勧めできません。 /)。したがって、代替手段はbus.Send(RecordPageAccessedCommand)を使用することです。

ただし、上記のコマンドは、とにかくアプリケーションの状態を変更しません。それで、それは本当にコマンドですか?私たちが犯している間違いは、NServiebusの機能(公開、送信)を使用して、それをコマンドまたはイベントと同一視しようとしていることだと感じています。

これに対する解決策を教えてください。

4

2 に答える 2

12

ご提供いただいた情報に基づいて、エンドポイントに「送信」することをお勧めします。

コマンドを送信することは、メッセージを処理するエンドポイントが何かを実行する必要があることを意味します。あなたの場合、ページがアクセスされたことを記録することは、エンドポイントが行うべきことです。

イベントを公開するということは、0..nサブスクライバーに何かが発生したことを通知していることを意味します。システム内の他のサービスがページにアクセスされたという事実に関心がある場合は、コマンドハンドラーからイベントを公開できます。ここで重要なのは、記録するまでは「事実」ではないということです。

データが利用可能になると、消費者は成長する傾向があることがわかりました。コマンドハンドラーからイベントを公開する機能があると、既存のコードベースを変更/リスクを冒すことなく、新しいコンシューマーに通知するのが簡単になります。

于 2012-05-01T04:45:26.397 に答える
1

RecordPageAccessedCommandは、システムに何かを実行するように命令しているためのコマンドです。この場合、ページがアクセスされたことを記録します

私があなたのシナリオを正しく理解したなら。コントローラから「ビジネスインテリジェンスチームサービス」にメッセージを送信して、ページにアクセスしたことを記録するようにシステムに通知する必要があります。このサービスはこの情報を保存し、この情報の所有者/技術機関になります。

他のサービスはこの情報を純粋な形式で保存または要求するべきではありませんが、このサービスからのイベントをサブスクライブできます。たとえば、ユーザーが1000ページを読んだ場合、「ビジネスインテリジェンスチームサービス」はイベントを公開できます。 1000ページが読み取られました。つまり、Bus.Publish()です。これは、次回の購入時にユーザーに割引を提供する課金サービスによって処理される場合があります。

データウェアハウスは、IT / OPSに該当するため、「ビジネスインテリジェンスチームサービス」に保存されているこの情報にアクセスできます。

于 2012-05-01T05:06:34.310 に答える