ASP.NET Core Middleware Passing Parameters to Controllers

You can use HttpContext.Items to pass arbitrary values inside the pipeline:

context.Items["some"] = "value";

A better solution would be to use a scoped service. Take a look at this: Per-request middleware dependencies

Your code should look like:

public class MyMiddleware
{
    private readonly RequestDelegate _next;

    public MyMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext httpContext, IImpersonatorRepo imperRepo)
    {
        imperRepo.MyProperty = 1000;
        await _next(httpContext);
    }
}

And then register your ImpersonatorRepo as:

services.AddScoped<IImpersonatorRepo, ImpersonatorRepo>()