// API Gateway
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/users", async context =>
{
var client = context.RequestServices.GetService();
var response = await client.GetStringAsync("http://user-service/api/users");
await context.Response.WriteAsync(response);
});
});
}
// CQRS with MediatR
public class GetProductQuery : IRequest { public int Id { get; set; } }
public class GetProductHandler : IRequestHandler
{
public async Task Handle(GetProductQuery request, CancellationToken cancellationToken)
{
return new ProductDto { Id = request.Id, Name = "Test" };
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext(options =>
options.UseSqlServer(Configuration.GetConnectionString("TenantConnection")));
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "SaaSIssuer"
});
services.AddStackExchangeRedisCache(options => options.Configuration = "localhost:6379");
}
public void ConfigureServices(IServiceCollection services)
{
services.AddApiVersioning(options =>
{
options.DefaultApiVersion = new ApiVersion(1, 0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.ReportApiVersions = true;
});
}
[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
public class ProductsController : ControllerBase
{
[HttpGet]
public IActionResult Get() => Ok("Version 1");
}
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("MyService")
.AddPolicyHandler(PollyExtensions.GetRetryPolicy())
.AddPolicyHandler(PollyExtensions.GetCircuitBreakerPolicy());
}
public static class PollyExtensions
{
public static IAsyncPolicy GetRetryPolicy()
{
return HttpPolicyExtensions.HandleTransientHttpError().RetryAsync(3);
}
public static IAsyncPolicy GetCircuitBreakerPolicy()
{
return HttpPolicyExtensions.HandleTransientHttpError().CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext(options =>
options.UseCosmos(
"https://mycosmos.documents.azure.com:443/",
"my-key",
"MyDatabase"));
}
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://identity-server";
options.Audience = "api1";
});
services.AddAuthorization(options =>
options.AddPolicy("Admin", policy => policy.RequireRole("admin")));
}
public interface IPlugin
{
Task ExecuteAsync();
}
public class PluginManager
{
private readonly List _plugins = new();
public void LoadPlugin(string assemblyPath)
{
var context = new AssemblyLoadContext("PluginContext", true);
var assembly = context.LoadFromAssemblyPath(assemblyPath);
var pluginType = assembly.GetTypes().FirstOrDefault(t => typeof(IPlugin).IsAssignableFrom(t));
if (pluginType != null)
_plugins.Add((IPlugin)Activator.CreateInstance(pluginType));
}
}
public class MyService
{
private readonly ISharedService _sharedService;
public MyService(ISharedService sharedService) => _sharedService = sharedService;
public async Task ExecuteAsync() => await _sharedService.DoWorkAsync();
}
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/bff/user", async (HttpClient client) =>
{
var user = await client.GetFromJsonAsync("http://user-service/api/user");
return new { user.Name, user.Role };
});
app.Run();
public class BackgroundTask
{
private readonly IServiceScopeFactory _scopeFactory;
public BackgroundTask(IServiceScopeFactory scopeFactory) => _scopeFactory = scopeFactory;
public async Task RunAsync()
{
using var scope = _scopeFactory.CreateScope();
var service = scope.ServiceProvider.GetService();
await service.DoWorkAsync();
}
}
public class Program
{
public static async Task Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
await host.RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices(services => services.AddHostedService());
}
public class CustomStartupService : IHostedService
{
public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask;
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}
public void Configure(IApplicationBuilder app)
{
app.UseExceptionHandler(errorApp => errorApp.Run(async context => await context.Response.WriteAsync("Error")));
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints => endpoints.MapControllers());
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddAotCompilation();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
services.AddStackExchangeRedisCache(options => options.Configuration = "localhost:6379");
}
public void Configure(IApplicationBuilder app)
{
app.UseResponseCompression();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton();
}
// Using Autofac
public class Program
{
public static void Main(string[] args)
{
var host = Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer(builder => builder.RegisterType().As())
.Build();
host.Run();
}
}
public class MyController : ControllerBase
{
private readonly ILogger _logger;
public MyController(ILogger logger) => _logger = logger;
[HttpGet]
public IActionResult Get()
{
var stopwatch = Stopwatch.StartNew();
var result = Ok("Data");
_logger.LogInformation("Request took {Duration}ms", stopwatch.ElapsedMilliseconds);
return result;
}
}
true
public class MyService : IDisposable
{
private bool _disposed;
public void Dispose()
{
if (!_disposed)
{
// Cleanup
_disposed = true;
}
}
}
public async Task> GetProductsAsync()
{
return await _context.Products
.AsNoTracking()
.Select(p => new ProductDto { Id = p.Id, Name = p.Name })
.ToListAsync();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddOpenTelemetryTracing(builder =>
builder.AddAspNetCoreInstrumentation().AddJaegerExporter());
}
public class MyController : ControllerBase
{
private readonly ILogger _logger;
public MyController(ILogger logger) => _logger = logger;
[HttpGet]
public IActionResult Get()
{
_logger.LogInformation("Processing request {RequestId}", Activity.Current?.Id);
return Ok();
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("MyApi", client => client.BaseAddress = new Uri("https://api.example.com/"));
}
[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
[ApiVersion("2.0")]
public class ProductsController : ControllerBase
{
[HttpGet]
[MapToApiVersion("1.0")]
public IActionResult GetV1() => Ok("V1");
[HttpGet]
[MapToApiVersion("2.0")]
public IActionResult GetV2() => Ok("V2 with new fields");
}
public async Task GetDataAsync(HttpClient client)
{
return Ok(await client.GetStringAsync("https://api.example.com"));
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
[Column(TypeName = "nvarchar(max)")]
public string LegacyData { get; set; } // Backward compatibility
}
public class MyController : Controller
{
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Post() => Ok();
}
public interface IServiceA { Task DoWorkAsync(); }
public interface IServiceB { Task DoWorkAsync(); }
public class ServiceA : IServiceA
{
private readonly IServiceB _serviceB;
public ServiceA(IServiceB serviceB) => _serviceB = serviceB;
public async Task DoWorkAsync() => await _serviceB.DoWorkAsync();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://identity-server";
options.Audience = "api1";
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "ServiceIssuer"
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("MyService")
.AddPolicyHandler(HttpPolicyExtensions.HandleTransientHttpError().RetryAsync(3))
.AddPolicyHandler(HttpPolicyExtensions.HandleTransientHttpError().CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)));
}
myrules.ruleset
// Nginx proxy configuration
server {
location /legacy {
proxy_pass http://legacy-app;
}
location / {
proxy_pass http://core-app;
}
}
public interface IMyService { Task DoWorkAsync(); }
public class MyService : IMyService
{
public async Task DoWorkAsync() => await Task.CompletedTask;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecks();
}
public void Configure(IApplicationBuilder app)
{
app.UseHealthChecks("/health");
}
public async Task> GetProductsAsync(IMemoryCache cache)
{
if (!cache.TryGetValue("products", out IEnumerable products))
{
products = await _context.Products.AsNoTracking().ToListAsync();
cache.Set("products", products, TimeSpan.FromMinutes(10));
}
return products;
}