.. _refProviders: ######### Providers ######### In Mediate a provider is the responsible for provide the message handlers and the middlewares. Default Providers ================= Mediate includes the following providers out-of-the-box. .. _refHandlerProviders: Service Provider Handler Provider --------------------------------- Provides the events and queries handlers from the DI Container. .. note:: The handlers are retrieved in the same registration order. .. _refMiddlewareProviders: Service Provider Middleware Provider ------------------------------------ Provides the events and queries middlewares from the DI Container. .. note:: The middlewares are retrieved in the same registration order. .. _refCustomHandlerProviders: Custom Handler Provider ======================= You can create a custom provider for the handlers to provide handlers in any form you want. For this purpose you have to implement the ``IHandlerProvider`` interface with your custom logic. .. sourcecode:: csharp /// /// Defines a provider that encapsulates event and query handlers provider /// public interface IHandlerProvider : IEventHandlerProvider, IQueryHandlerProvider { } The above interface is segregated in ``IEventHandlerProvider`` and ``IQueryHandlerProvider`` for more flexibility. .. sourcecode:: csharp /// /// Interface for implement an event handler provider /// public interface IEventHandlerProvider { /// /// Gets all event handlers from an event /// /// Event type /// All registered handlers for that event Task>> GetHandlers() where TEvent : IEvent; } /// /// Interface for implement a query handler provider /// public interface IQueryHandlerProvider { /// /// Gets a query handler from a concrete query /// /// Query type /// Query response type /// Registered handler for that query Task> GetHandler() where TQuery : IQuery; } To register your custom implementation you can use the ``AddCustomHandlerProvider`` advanced configuration method. See :ref:`Advanced configuration ` .. _refCustomMiddlewareProviders: Custom Middleware Provider ========================== You can create a custom provider for the middlewares to provide middlewares in any form you want. For this purpose you have to implement the ``IMiddlewareProvider`` interface with your custom logic. .. sourcecode:: csharp /// /// Defines a provider that encapsulates event and query middlewares provider /// public interface IMiddlewareProvider : IEventMiddlewareProvider, IQueryMiddlewareProvider { } The above interface is segregated in ``IEventMiddlewareProvider`` and ``IQueryMiddlewareProvider`` for more flexibility. .. sourcecode:: csharp /// /// Interface for implement an event middleware provider /// public interface IEventMiddlewareProvider { /// /// Gets all event middlewares from an event /// /// Event type /// All registered middlewares for that event Task>> GetMiddlewares() where TEvent : IEvent; } /// /// Interface for implement a query middleware provider /// public interface IQueryMiddlewareProvider { /// /// Gets all query middlewares from a query /// /// Query type /// Query response type /// All registered middlewares for that query Task>> GetMiddlewares() where TQuery : IQuery; } To register your custom implementation you can use the ``AddCustomMiddlewareProvider`` advanced configuration method. See :ref:`Advanced configuration `