Saga with Application layer / DDD

Is there an advantage in using IMessageHandlerContext over registering IMessageSession impl (Endpoint instance) in a DI container?
With IMessageSession in the container I can have the application layer independent of NServiceBus.

NServiceBus Sagas can be used in two ways, either as process managers or as way of implementing your aggregates.

Thanks for mentioning it. It opens new ways of thinking about it.
In this case it seems I use the saga as a process manager.

If it was an implementation of an aggregate, the saga should really be a part of the application layer.
Also it seems to be a good idea to have the app services as actual handlers like you suggest:

// Application

public class BookingService : IHandleMessages<ConfirmBooking>
{
...

However, this would mean the application layer had to be dependent on a specific technology like NServiceBus. I consider NServiceBus more like a communication library used in a client app (a separate project creating an endpoint).

I can imagine a situation where there are more aggregates per process (a saga with one aggregate doesn’t fit here) or more clients (Asp. Net Core REST client, a console app client) using the application layer. They won’t call a logic hidden in a IHandleMessages.Handler method. At least they can’t pass IMessageHandlerContext there. It seems in this case the saga handler should call the application logic the same as the rest api client would do.

A picture how I imagine it (1) and what I understood you suggest (2 or 3). Consider the rest client, nsb client, application, domain and infrastructure to be separate projects.

1.
rest client (controllers) ->
nsb client (endpoint,sagas,handlers) ->
                                                  application -> domain
                                                              -> infrastructure
                                                                          -> db
                                                                          -> http
                                                                          -> nsb
2.
rest client (controllers) ->
nsb client (endpoint) ->
                                 application (sagas,handlers) -> domain
                                                              -> infrastructure
                                                                          -> db
                                                                          -> http
                                                                          -> nsb
3.
rest client (controllers) ->
                         nsb client (endpoint,sagas,handlers) -> domain
                                                              -> infrastructure
                                                                          -> db
                                                                          -> http
                                                                          -> nsb

you can instead send a delayed message to yourself.

Is there any difference between the delayed message and the timeout?
Can I use the delayed message as it would be a timeout or the timeout is safer or better for something.