Skip to content

Commit

Permalink
Code(Cross-cutting concerns): Add abstraction to handle endpoints for…
Browse files Browse the repository at this point in the history
… minimal API
  • Loading branch information
ktutak1337 committed Mar 16, 2024
1 parent b52005e commit e07f837
Showing 3 changed files with 77 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/Server/StellarChat.Server.Api/Program.cs
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@
using StellarChat.Shared.Infrastructure.Observability.Logging;
using StellarChat.Shared.Infrastructure.DAL.Mongo;
using StellarChat.Shared.Infrastructure.API.CORS;
using StellarChat.Shared.Infrastructure.API.Endpoints;

var builder = WebApplication.CreateBuilder(args);

@@ -15,6 +16,7 @@
builder.Services.AddCorsPolicy(builder.Configuration);
builder.Host.UseLogging();
builder.Services.AddMongo(builder.Configuration);
builder.Services.RegisterEndpoints(builder.Configuration);

var app = builder.Build();

@@ -30,6 +32,8 @@
app.UseErrorHandling();
app.UseContext();
app.UseLogging();
app.UseEndpoints();
app.MapEndpoints();

var summaries = new[]
{
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace StellarChat.Shared.Abstractions.API.Endpoints;

public interface IEndpoint
{
void Register(IServiceCollection services, IConfiguration configuration);
void Use(IApplicationBuilder app);
void Expose(IEndpointRouteBuilder endpoints);

protected static IResult Select<TData>(TData data)
where TData : class
=> data is null
? Results.NotFound()
: Results.Ok(data);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using StellarChat.Shared.Abstractions.API.Endpoints;

namespace StellarChat.Shared.Infrastructure.API.Endpoints;

public static class Extensions
{
private static readonly List<IEndpoint> registeredEndpoints = new();

public static IServiceCollection RegisterEndpoints(this IServiceCollection services, IConfiguration configuration)
{
var endpoints = DiscoverEndpoints();

foreach (var endpoint in endpoints)
{
endpoint.Register(services, configuration);
registeredEndpoints.Add(endpoint);
}

return services;
}

public static IApplicationBuilder UseEndpoints(this IApplicationBuilder app)
{
foreach (var endpoint in registeredEndpoints)
{
endpoint.Use(app);
}

return app;
}

public static WebApplication MapEndpoints(this WebApplication app)
{
foreach (var endpoint in registeredEndpoints)
{
endpoint.Expose(app);
}

return app;
}

private static IList<IEndpoint> DiscoverEndpoints()
=> AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(p => p.IsClass && p.IsAssignableTo(typeof(IEndpoint)))
.Select(Activator.CreateInstance)
.Cast<IEndpoint>()
.ToList();
}

0 comments on commit e07f837

Please sign in to comment.