Skip to content
Download

Registering Middleware

Middleware is added to the request pipeline through AppBuilder.

Use builder.use<>() to register a middleware type:

mach::AppBuilder builder;
builder.use<LoggingMiddleware>();
auto app = builder.build();

Once registered, the middleware participates in the request pipeline for the application.

If a middleware has constructor dependencies, list them as additional template arguments when registering it.

For example:

class LoggingMiddleware {
public:
explicit LoggingMiddleware(mach::Logger& logger)
: m_logger(logger) {}
void invoke(mach::Context& context, mach::Next& next) {
m_logger.info("Before handler");
next();
m_logger.info("After handler");
}
private:
mach::Logger& m_logger;
};

Register it with its dependency:

mach::AppBuilder builder;
builder.use<LoggingMiddleware, mach::Logger>();
auto app = builder.build();

The dependency list must match the middleware constructor parameters in the same order.

For multiple dependencies:

builder.use<MyMiddleware, FirstService, SecondService>();

Mach uses the registered services to construct the middleware when the application is built.

An application can register multiple middleware:

mach::AppBuilder builder;
builder.use<ExceptionMiddleware>();
builder.use<LoggingMiddleware, mach::Logger>();
builder.use<SecurityMiddleware>();
auto app = builder.build();

Each registered middleware becomes part of the same request pipeline.

The order of these registrations matters because it determines how middleware wraps later middleware and endpoints.

That behavior is covered in the next guide.

Middleware is configured on AppBuilder, so registration happens before calling build():

mach::AppBuilder builder;
builder.use<LoggingMiddleware, mach::Logger>();
auto app = builder.build();

After the application is built, the middleware pipeline is ready to process requests.


Next, you’ll learn how middleware registration order affects request and response execution.