🏗️ Architecture & Data
Dependency Injection & Services
MauiProgram.cs, AddSingleton vs AddTransient, constructor injection.

MauiProgram.cs — The DI Root

MAUI uses Microsoft.Extensions.DependencyInjection — the same container as ASP.NET Core. Every service, ViewModel, and page is registered here.

csharp
public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder.UseMauiApp<App>();

        // HttpClient with base address
        builder.Services.AddHttpClient<IWeatherService, WeatherService>(c =>
            c.BaseAddress = new Uri("https://api.weather.example.com/"));

        // Singleton — one instance for the app lifetime
        builder.Services.AddSingleton<DatabaseService>();

        // Transient — fresh instance per navigation
        builder.Services.AddTransient<WeatherViewModel>();
        builder.Services.AddTransient<WeatherPage>();

        return builder.Build();
    }
}

Constructor Injection

csharp
public partial class WeatherPage : ContentPage
{
    public WeatherPage(WeatherViewModel vm)
    {
        InitializeComponent();
        BindingContext = vm;
    }
}
💡
Use AddSingleton for database connections and app state. Use AddTransient for pages and ViewModels — each navigation gets a fresh instance.

Key Takeaways

MauiProgram.cs is the app composition root — all services registered here
AddSingleton: one shared instance for the app lifetime
AddTransient: new instance every time the type is resolved
Inject interfaces not concrete types — supports mocking in unit tests
Lesson 20 of 30Architecture & Data
← Previous Next Lesson →