There are two standard ways of executing code when a message is processed: handlers and sagas.
Handler instances are instantiated on a per-message basis, executed, and then disposed of. These are sometimes referred to as “stateless handlers”.
Saga instances are also instantiated on a per-message basis, executed, and then disposed of. However they differ from handlers in that, once instantiated, they are passed an instance of a "Data" class. The "Saga Data" is persistent state that is shared between a given saga type based on a key. These are sometimes referred to as “stateful handlers”.
Other concepts that both handlers and sagas share:
- Recoverability (i.e. what happens when message processing fails)
- Executed within the same pipeline
- Detected via assembly scanning