Home > Mobile >  Accessing the parameters injected in ConfigureServices from custom Middleware
Accessing the parameters injected in ConfigureServices from custom Middleware

Time:05-06

I am practicing to learn more about the Dependency Injection and the Middleware in ASP.NET Core and I have faced an issue I can not resolve, so need the assistance of fellow members of StackOverflow.

In my project I am trying to create a middleware which will combine some initial data with another data gathered in the runtime.

I have the following class as the initial data

public class A
{
    public string Name { get; set; }
    public string Description { get; set; }
}

I created the following class for dependency injection

namespace Microsoft.Extensions.DependencyInjection
{
    public static class MiddlewareInitialDataExtension
    {
        public static IServiceCollection AddInitialData(this IServiceCollection services, Action<A> data)
        {
            A a = new A();
            data(a);
            return services.AddSingleton<A>(a);
        }    
    }
}

And in the Startup.cs file I am injecting it as follows :

public void ConfigureServices(IServiceCollection services)
{
    services.AddInitialData(d =>
    {
        d.Name = "Some name";
        d.Description = "Some description";
    });
}

I have also written my Middleware as follows :

public class MyMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task Invoke(HttpContext context)
    {
        await this._next(context);
    }
}

and registered my middleware in the Starup.cs file as follows :

public void Configure(IApplicationBuilder app, IHostEnvironment env)
{
    app.UseMiddleware(typeof(MyMiddleware));
}

At this point I need to access the object instantiated from the A class and injected into the app when Invoke(HttpContext context) method is called.

So far I have found some examples using dependency injection in a different way such as passing the object (from class A) to the constructor of middleware, but instead I would like to read the object with its values set as it is written.

CodePudding user response:

You can pass whatever parameter you like to the Invoke method and the DI will take care of the injection. The first parameter should be the HttpContext.

public MyMiddleware(RequestDelegate next)
public async Task InvokeAsync(HttpContext context, A theA)

If you want to pass the parameter at the constructor then you have to use Factory-based middleware

public MyMiddleware(A theA)
public async Task InvokeAsync(HttpContext context, RequestDelegate next)

CodePudding user response:

As you've registered the instance of A in startup, you can add that to the signature in your middleware constructor:

private readonly A _a;

public MyMiddleware(RequestDelegate next, A instanceOfA)
{
  _a = instanceOfA;
}

public async Task Invoke(HttpContext context)
{
    Console.WriteLine(_a.Name); // should print "Some name"
    await this._next(context);
}
  • Related