shiny-web-hosting

star 2

Generate and configure Shiny Web Hosting for .NET - modular ASP.NET Core application configuration with IWebModule for clean service registration and middleware setup

shinyorg By shinyorg schedule Updated 6/6/2026

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.cs into 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 before Build()
  • Use(WebApplication app) — configure middleware, endpoints, and anything after Build()
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 and Use() for middleware configuration
  • Pass explicit module instances to AddInfrastructureModules() — no assembly scanning

Best Practices

  1. One concern per module - Create separate modules for CORS, auth, swagger, health checks, etc.
  2. Order matters for Use() - Middleware order in Use() follows the order modules are registered
  3. Fully AOT-compatible - No reflection or assembly scanning, explicit module registration only
Install via CLI
npx skills add https://github.com/shinyorg/skills --skill shiny-web-hosting
Repository Details
star Stars 2
call_split Forks 0
navigation Branch main
article Path SKILL.md
More from Creator