Claude-skill-registry configuring-console-app-di
Implements dependency injection using GenericHost in .NET Console Applications. Use when building console applications that require DI, hosted services, or background tasks.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/configuring-console-app-di" ~/.claude/skills/majiayu000-claude-skill-registry-configuring-console-app-di && rm -rf "$T"
manifest:
skills/data/configuring-console-app-di/SKILL.mdsource content
Console Application DI Pattern
A guide for implementing dependency injection using GenericHost in .NET Console Application.
1. Required NuGet Package
<ItemGroup> <PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.*" /> </ItemGroup>
2. Basic Implementation
2.1 Program.cs
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var host = Host.CreateDefaultBuilder(args) .ConfigureServices((context, services) => { services.AddSingleton<IMyService, MyService>(); services.AddSingleton<App>(); }) .Build(); var app = host.Services.GetRequiredService<App>(); await app.RunAsync();
2.2 App.cs
namespace MyApp; public sealed class App(IMyService myService) { private readonly IMyService _myService = myService; public async Task RunAsync() { await _myService.DoWorkAsync(); } }
3. Service Lifetime
| Lifetime | Description | Use When |
|---|---|---|
| Single instance for entire app | Stateless services |
| Single instance per request | DbContext |
| New instance per injection | Lightweight services |
4. Configuration Integration
var host = Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { config.AddJsonFile("appsettings.json", optional: true); }) .ConfigureServices((context, services) => { services.Configure<AppSettings>( context.Configuration.GetSection("AppSettings")); services.AddSingleton<App>(); }) .Build();
5. Logging Integration
public sealed class App(ILogger<App> logger) { public Task RunAsync() { logger.LogInformation("Application started"); return Task.CompletedTask; } }
6. Important Notes
⚠️ Avoid Service Locator Pattern
// ❌ Bad example public sealed class BadService(IServiceProvider provider) { public void DoWork() { var service = provider.GetRequiredService<IMyService>(); } } // ✅ Good example public sealed class GoodService(IMyService myService) { public void DoWork() { } }
⚠️ Captive Dependency
- Singleton should not inject Scoped/Transient dependencies