Search code examples
c#asp.netasp.net-coreminimal-apisscrutor

Register minimal API IEndpointRouteBuilder with Scrutor


I have created an Interface.

public interface IEndpoint
{
    RouteGroupBuilder MapRoutes(IEndpointRouteBuilder rotues);
}

And it's implementation like this.

public class TodoApi : IEndpoint
{
    public RouteGroupBuilder MapRoutes(IEndpointRouteBuilder rotues)
    {
        var group = rotues.MapGroup("/todo");
        group.MapGet("/", () => "Hello");
        return group;
    }
}

And I am able to load the classes with Scrutor like this.

var enpointServices = new ServiceCollection();
enpointServices.Scan(scan =>
    scan.FromAssemblyOf<IEndpoint>()
    .AddClasses(classes => classes.AssignableTo<IEndpoint>())
    .AsImplementedInterfaces()
    );

Now how do I register the endpoints in WebApplication app Program.cs.

var app = builder.Build();
foreach (var item in enpointServices)
{
    if (item.ImplementationInstance is IEndpoint endpoint)
    {
        // What to do now?
    }
}

Thanks

I have tried to use app.MapGroup but it takes two parameters.


Solution

  • Build-in DI provider supports resolving enumerable of registered types, so just build the service provider from collection and resolve enumerable of the IEndpoint:

    var serviceProvider = enpointServices.BuildServiceProvider();
    foreach (var item in serviceProvider.GetRequiredService<IEnumerable<IEndpoint>>())
    {
        item.MapRoutes(app);
    }