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:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.*" />
|
||||
|
||||
Reference in New Issue
Block a user