feat: wire up Program.cs with DI, background services, and tray UI

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-07 11:47:01 +01:00
parent f907f9e8f1
commit 98e2da745a
2 changed files with 81 additions and 2 deletions

View File

@@ -1,2 +1,78 @@
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
// src/SpamGuard/Program.cs
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;
using SpamGuard.Configuration;
using SpamGuard.Services;
using SpamGuard.State;
using SpamGuard.Tray;
namespace SpamGuard;
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetHighDpiMode(HighDpiMode.SystemAware);
var dataDir = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"SpamGuard");
Directory.CreateDirectory(dataDir);
Log.Logger = new LoggerConfiguration()
.WriteTo.File(
Path.Combine(dataDir, "logs", "spamguard-.log"),
rollingInterval: RollingInterval.Day,
retainedFileCountLimit: 7)
.CreateLogger();
try
{
var host = Host.CreateDefaultBuilder()
.UseSerilog()
.ConfigureAppConfiguration((context, config) =>
{
config.AddJsonFile("appsettings.json", optional: false);
config.AddEnvironmentVariables("SPAMGUARD_");
})
.ConfigureServices((context, services) =>
{
services.Configure<SpamGuardOptions>(
context.Configuration.GetSection(SpamGuardOptions.SectionName));
// State stores
services.AddSingleton(new ProcessedUidStore(dataDir));
services.AddSingleton(new TrustedSenderStore(dataDir));
// Services
services.AddSingleton<ActivityLog>();
services.AddSingleton<ImapClientFactory>();
services.AddSingleton<EmailClassifier>();
services.AddHttpClient<EmailClassifier>();
// Background services
services.AddSingleton<InboxMonitorService>();
services.AddHostedService(sp => sp.GetRequiredService<InboxMonitorService>());
services.AddHostedService<TrustedSenderService>();
})
.Build();
host.Start();
Application.Run(new TrayApplicationContext(host));
}
catch (Exception ex)
{
Log.Fatal(ex, "Application failed to start");
}
finally
{
Log.CloseAndFlush();
}
}
}

View File

@@ -12,6 +12,9 @@
<PackageReference Include="MailKit" Version="4.*" />
<PackageReference Include="Anthropic" Version="12.*" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.*" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.*" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="8.*" />
<PackageReference Include="Microsoft.Extensions.Http" Version="8.*" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="8.*" />
<PackageReference Include="Serilog.Sinks.File" Version="5.*" />
<PackageReference Include="Serilog.Sinks.Console" Version="5.*" />