-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMauiProgram.cs
More file actions
149 lines (119 loc) · 6.08 KB
/
MauiProgram.cs
File metadata and controls
149 lines (119 loc) · 6.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
using CommunityToolkit.Maui;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System.Reflection;
using WorkActivityTracker.Data;
using WorkActivityTracker.Services;
namespace WorkActivityTracker;
/// <summary>
/// Classe di configurazione principale dell'applicazione MAUI.
/// Configura i servizi, il database e l'interfaccia Blazor Hybrid.
/// </summary>
public static class MauiProgram
{
/// <summary>
/// Crea e configura l'applicazione MAUI con tutti i servizi necessari.
/// </summary>
/// <returns>Istanza configurata di MauiApp</returns>
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.UseMauiCommunityToolkit() // Abilita CommunityToolkit per FolderPicker
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
// =============================================
// CONFIGURAZIONE DA FILE ESTERNO
// Il file appsettings.json viene cercato nella cartella dell'applicazione
// =============================================
var configuration = LoadConfiguration();
builder.Services.AddSingleton<IConfiguration>(configuration);
// Abilita Blazor WebView per l'interfaccia utente
builder.Services.AddMauiBlazorWebView();
#if DEBUG
// In debug, abilita gli strumenti di sviluppo Blazor
builder.Services.AddBlazorWebViewDeveloperTools();
#endif
// =============================================
// CONFIGURAZIONE DATABASE SQL SERVER
// La stringa di connessione viene letta da appsettings.json
// =============================================
var connectionString = configuration.GetConnectionString("DefaultConnection")
?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found in appsettings.json");
// Registra il DbContext come factory (per supporto multi-thread)
builder.Services.AddDbContextFactory<AppDbContext>(options =>
options.UseSqlServer(connectionString));
// =============================================
// REGISTRAZIONE SERVIZI
// =============================================
// Configurazione: rende disponibile IConfiguration per i servizi
builder.Services.AddSingleton<IConfiguration>(configuration);
// AppConfigService: Singleton per le configurazioni dell'app
builder.Services.AddSingleton<AppConfigService>();
// UserService: Singleton perché l'utente non cambia durante l'esecuzione
builder.Services.AddSingleton<UserService>();
// ActivityService: Scoped perché crea nuovi DbContext per ogni operazione
builder.Services.AddScoped<ActivityService>();
// TodoService: Scoped per la gestione dei TODO
builder.Services.AddScoped<TodoService>();
// AmbienteService: Scoped per la gestione dei congelati
builder.Services.AddScoped<AmbienteService>();
// AppuntiService: Scoped per la gestione degli appunti (Knowledge Base)
builder.Services.AddScoped<AppuntiService>();
// ClienteService: Scoped per la gestione dei clienti con logging
builder.Services.AddScoped<ClienteService>();
// ClienteAmbienteService: Scoped per la gestione degli ambienti per cliente (v4.7)
builder.Services.AddScoped<ClienteAmbienteService>();
// SegnalazioneService: Scoped per la gestione delle segnalazioni
builder.Services.AddScoped<SegnalazioneService>();
// AmbientiRilascioService: Scoped per la gestione dei tipi ambienti e versioni di rilascio
builder.Services.AddScoped<AmbientiRilascioService>();
// TipiAttivitaService: Scoped per la gestione dei tipi attività personalizzati
builder.Services.AddScoped<TipiAttivitaService>();
// CalendarioService: Scoped per la gestione degli eventi del calendario
builder.Services.AddScoped<CalendarioService>();
// EditorHistoryService: Scoped per la gestione dello storico versioni Note/Changeset
builder.Services.AddScoped<EditorHistoryService>();
// UnsavedChangesService: Singleton per tracciare modifiche non salvate
builder.Services.AddSingleton<UnsavedChangesService>();
return builder.Build();
}
/// <summary>
/// Carica la configurazione da appsettings.json.
/// Cerca il file prima nella cartella dell'eseguibile, poi nella cartella corrente.
/// </summary>
private static IConfiguration LoadConfiguration()
{
var configBuilder = new ConfigurationBuilder();
// Percorso della cartella dell'applicazione
var appDirectory = AppContext.BaseDirectory;
var configPath = Path.Combine(appDirectory, "appsettings.json");
// Se non trova nella cartella dell'app, prova la cartella corrente
if (!File.Exists(configPath))
{
configPath = "appsettings.json";
}
// Se il file esiste, lo carica
if (File.Exists(configPath))
{
configBuilder.AddJsonFile(configPath, optional: false, reloadOnChange: true);
}
else
{
// Se non trova il file, crea una configurazione con valori di default
// Questo permette all'app di avviarsi anche senza il file (per debug)
System.Diagnostics.Debug.WriteLine($"WARNING: appsettings.json not found at {configPath}");
// Usa configurazione in-memory con valori di default
var defaultConfig = new Dictionary<string, string?>
{
["ConnectionStrings:DefaultConnection"] = "Data Source=localhost;Initial Catalog=WorkActivityTracker;Integrated Security=True;TrustServerCertificate=True"
};
configBuilder.AddInMemoryCollection(defaultConfig);
}
return configBuilder.Build();
}
}