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.
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);
}