イベント ドリブン アーキテクチャを始めたばかりで、コマンドとイベントの命名規則を知りたいです。コマンドは DoSomething の形式である必要があり、イベントは SomethingHappened の形式である必要があります。明確にする必要があるのは、コマンドに「コマンド」という単語を追加し、イベントに「イベント」という単語を追加する必要があるかどうかです。また、コミュニティが好む慣習の背後にある理論的根拠を知りたいです。ありがとう!
5 に答える
およびサフィックスはオプションであり、好みの問題ですCommand
。Event
私はそれらを省略し、名前だけから意図を明らかにしようとしています。コマンドとイベントに名前を付ける際の最も重要な側面は、それらが技術的なドメインよりもビジネスのドメインを反映していることを確認することです。多くの場合、作成、更新、追加、変更などの用語は技術的すぎて、ビジネス ドメインではあまり意味がありません。たとえば、どちらがより大きなビジネス コンテキストを持つ可能性があるUpdateCustomerAddress
かを言うことができます。RelocateCustomer
私の慣習は名前空間に依存しています。つまり、接尾辞 Event も Command も使用しないということです。
また、コマンドとイベントが影響を与える集合体の種類に基づいて、個別の名前空間に整理します。
例:
// Commands
MyApp.Messages.Commands.Customers.Create
MyApp.Messages.Commands.Orders.Create
MyApp.Messages.Commands.Orders.AddProduct
// Events
MyApp.Messages.Events.Customers.Created
MyApp.Messages.Events.Orders.Created
MyApp.Messages.Events.Orders.ProductAdded
要件によっては、イベントを別のアセンブリに配置したい場合があります。この理由は、イベントを下流のシステムに配布する必要がある場合です。その場合、下流のシステムがコマンドに煩わされることを望まないでしょう (そうするべきではないため)。
私がよく目にし、自分自身で使用している慣例は、イベントは過去形で、何が起こったかを説明するものでなければならないというものです。
- ユーザー登録
- アカウント有効化
- 返信投稿済み
コマンドはあなたがやりたいことです。したがって、それを示す名前を作成します。
- ユーザーを作成
- アップグレード ユーザー アカウント
組織に関しては、通常、それらが対象とするルート集合体と一緒にまとめます。これにより、何ができるのか、どのようなイベントが生成されるのかを簡単に確認できます。
つまり、ルート アグリゲートごとに名前空間を作成し、その下にすべて (リポジトリ定義、イベント、コマンド) を配置します。
- MyApp.Core.Users
- MyApp.Core.Posts
等
Commands and Events form a language for your application...an API. The use of terms like 'command' and 'event' are perhaps useful for system-level definitions where technical terms are meaningfully mixed into an entity's purpose, but if you are dealing with definitions for Domain behavior's, then drop the system/technical terminology and favor the business-speak. It will make your code read more naturally and lessen typing. I started with the 'Command'/'Event' appendages but realized it was a waste of time and drew me away from the Ubiquitous Language DDD popularized. HTH, Mike
コマンド/イベントに適切な名前が付けられている場合、コマンドとイベントを追加すると冗長な情報になります。これは、コードを読みにくくするノイズになります。ハンガリー記法を覚えていますか?ほとんどのプログラマー (私が知っている) は、もう使用していません。