name: shiny-web-hosting description: Generate and configure Shiny Web Hosting for .NET - modular ASP.NET Core application configuration with IWebModule for clean service registration and middleware setup auto_invoke: true triggers:
- "IWebModule"
- "AddInfrastructureModules"
- "UseInfrastructureModules"
- "Shiny.Extensions.WebHosting"
- "WebExtensions"
Shiny Web Hosting Skill
Triggers
- IWebModule
- AddInfrastructureModules
- UseInfrastructureModules
- Shiny.Extensions.WebHosting
- WebExtensions
You are an expert in Shiny Extensions Web Hosting, a .NET library providing modular ASP.NET Core application configuration via IWebModule.
When to Use This Skill
Invoke this skill when the user wants to:
- Create ASP.NET web modules with
IWebModule - Set up web hosting with modular service/middleware registration
- Break apart a monolithic
Program.csinto focused module classes
Library Overview
Documentation: https://shinylib.net/extensions/webhost/
Repository: https://github.com/shinyorg/Shiny.Extensions
Package: Shiny.Extensions.WebHosting
Namespace: Shiny
IWebModule Interface
public interface IWebModule
{
void Add(WebApplicationBuilder builder); // Register services
void Use(WebApplication app); // Configure middleware
}
Creating Web Modules
Each module implements IWebModule with two methods:
Add(WebApplicationBuilder builder)— register services, configuration, and anything beforeBuild()Use(WebApplication app)— configure middleware, endpoints, and anything afterBuild()
public class SwaggerModule : IWebModule
{
public void Add(WebApplicationBuilder builder)
{
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
}
public void Use(WebApplication app)
{
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
}
}
public class CorsModule : IWebModule
{
public void Add(WebApplicationBuilder builder)
{
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(policy =>
policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
});
}
public void Use(WebApplication app)
{
app.UseCors();
}
}
public class AuthModule : IWebModule
{
public void Add(WebApplicationBuilder builder)
{
builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();
}
public void Use(WebApplication app)
{
app.UseAuthentication();
app.UseAuthorization();
}
}
Setup
using Shiny;
var builder = WebApplication.CreateBuilder(args);
builder.AddInfrastructureModules(
new SwaggerModule(),
new CorsModule(),
new AuthModule()
);
var app = builder.Build();
app.UseInfrastructureModules();
app.Run();
API
public static class WebExtensions
{
// Register module instances and call Add() on each
public static WebApplicationBuilder AddInfrastructureModules(
this WebApplicationBuilder builder,
params IEnumerable<IWebModule> modules);
// Call Use() on each module to configure middleware
public static WebApplication UseInfrastructureModules(
this WebApplication app,
params IEnumerable<IWebModule> modules);
}
Code Generation Instructions
- One module per concern (CORS, auth, swagger, health checks, etc.)
- Keep
Add()for service registration andUse()for middleware configuration - Pass explicit module instances to
AddInfrastructureModules()— no assembly scanning
Best Practices
- One concern per module - Create separate modules for CORS, auth, swagger, health checks, etc.
- Order matters for Use() - Middleware order in
Use()follows the order modules are registered - Fully AOT-compatible - No reflection or assembly scanning, explicit module registration only