--- title: Factory-based middleware activation in ASP.NET Core author: guardrex description: Learn how to use strongly-typed middleware with a factory-based activation implementation in ASP.NET Core. monikerRange: '>= aspnetcore-2.1' ms.author: riande ms.custom: mvc ms.date: 09/22/2019 uid: fundamentals/middleware/extensibility --- # Factory-based middleware activation in ASP.NET Core By [Luke Latham](https://github.com/guardrex) ::: moniker range=">= aspnetcore-3.0" / is an extensibility point for [middleware](xref:fundamentals/middleware/index) activation. extension methods check if a middleware's registered type implements . If it does, the instance registered in the container is used to resolve the implementation instead of using the convention-based middleware activation logic. The middleware is registered as a [scoped or transient service](xref:fundamentals/dependency-injection#service-lifetimes) in the app's service container. Benefits: * Activation per client request (injection of scoped services) * Strong typing of middleware is activated per client request (connection), so scoped services can be injected into the middleware's constructor. [View or download sample code](https://github.com/aspnet/AspNetCore.Docs/tree/master/aspnetcore/fundamentals/middleware/extensibility/samples) ([how to download](xref:index#how-to-download-a-sample)) ## IMiddleware defines middleware for the app's request pipeline. The [InvokeAsync(HttpContext, RequestDelegate)](xref:Microsoft.AspNetCore.Http.IMiddleware.InvokeAsync*) method handles requests and returns a that represents the execution of the middleware. Middleware activated by convention: [!code-csharp[](extensibility/samples/3.x/MiddlewareExtensibilitySample/Middleware/ConventionalMiddleware.cs?name=snippet1)] Middleware activated by : [!code-csharp[](extensibility/samples/3.x/MiddlewareExtensibilitySample/Middleware/FactoryActivatedMiddleware.cs?name=snippet1)] Extensions are created for the middlewares: [!code-csharp[](extensibility/samples/3.x/MiddlewareExtensibilitySample/Middleware/MiddlewareExtensions.cs?name=snippet1)] It isn't possible to pass objects to the factory-activated middleware with : ```csharp public static IApplicationBuilder UseFactoryActivatedMiddleware( this IApplicationBuilder builder, bool option) { // Passing 'option' as an argument throws a NotSupportedException at runtime. return builder.UseMiddleware(option); } ``` The factory-activated middleware is added to the built-in container in `Startup.ConfigureServices`: [!code-csharp[](extensibility/samples/3.x/MiddlewareExtensibilitySample/Startup.cs?name=snippet1&highlight=6)] Both middlewares are registered in the request processing pipeline in `Startup.Configure`: [!code-csharp[](extensibility/samples/3.x/MiddlewareExtensibilitySample/Startup.cs?name=snippet2&highlight=12-13)] ## IMiddlewareFactory provides methods to create middleware. The middleware factory implementation is registered in the container as a scoped service. The default implementation, , is found in the [Microsoft.AspNetCore.Http](https://www.nuget.org/packages/Microsoft.AspNetCore.Http/) package. ::: moniker-end ::: moniker range="< aspnetcore-3.0" / is an extensibility point for [middleware](xref:fundamentals/middleware/index) activation. extension methods check if a middleware's registered type implements . If it does, the instance registered in the container is used to resolve the implementation instead of using the convention-based middleware activation logic. The middleware is registered as a [scoped or transient service](xref:fundamentals/dependency-injection#service-lifetimes) in the app's service container. Benefits: * Activation per client request (injection of scoped services) * Strong typing of middleware is activated per client request (connection), so scoped services can be injected into the middleware's constructor. [View or download sample code](https://github.com/aspnet/AspNetCore.Docs/tree/master/aspnetcore/fundamentals/middleware/extensibility/samples) ([how to download](xref:index#how-to-download-a-sample)) ## IMiddleware defines middleware for the app's request pipeline. The [InvokeAsync(HttpContext, RequestDelegate)](xref:Microsoft.AspNetCore.Http.IMiddleware.InvokeAsync*) method handles requests and returns a that represents the execution of the middleware. Middleware activated by convention: [!code-csharp[](extensibility/samples/2.x/MiddlewareExtensibilitySample/Middleware/ConventionalMiddleware.cs?name=snippet1)] Middleware activated by : [!code-csharp[](extensibility/samples/2.x/MiddlewareExtensibilitySample/Middleware/FactoryActivatedMiddleware.cs?name=snippet1)] Extensions are created for the middlewares: [!code-csharp[](extensibility/samples/2.x/MiddlewareExtensibilitySample/Middleware/MiddlewareExtensions.cs?name=snippet1)] It isn't possible to pass objects to the factory-activated middleware with : ```csharp public static IApplicationBuilder UseFactoryActivatedMiddleware( this IApplicationBuilder builder, bool option) { // Passing 'option' as an argument throws a NotSupportedException at runtime. return builder.UseMiddleware(option); } ``` The factory-activated middleware is added to the built-in container in `Startup.ConfigureServices`: [!code-csharp[](extensibility/samples/2.x/MiddlewareExtensibilitySample/Startup.cs?name=snippet1&highlight=6)] Both middlewares are registered in the request processing pipeline in `Startup.Configure`: [!code-csharp[](extensibility/samples/2.x/MiddlewareExtensibilitySample/Startup.cs?name=snippet2&highlight=13-14)] ## IMiddlewareFactory provides methods to create middleware. The middleware factory implementation is registered in the container as a scoped service. The default implementation, , is found in the [Microsoft.AspNetCore.Http](https://www.nuget.org/packages/Microsoft.AspNetCore.Http/) package. ::: moniker-end ## Additional resources * *