As you might know, I am in the process of converting all my internal used libraries to be .NET MAUI compatible. This is quite a bigger task than initially thought, although I somehow enjoy the process. One thing I ran pretty fast into is the fact that you can’t access the MAUI app’s IServiceProvider
by default.
Possible solutions
As always, there is more than one solution. While @DavidOrtinau shows one approach in the WeatherTwentyOne application that accesses the platform implementation of the Services, I prefer another approach that uses, in fact, Dependency Injection to achieve the same goal.
Implementation
I am subclassing the Microsoft.Maui.Controls.Application to provide my own, overloaded constructor where I inject the IServiceProvider
used by the MAUI application. Within the constructor, I am using the MVVM CommunityToolkit’s Ioc.Default.ConfigureServices
method to initialize the toolkit’s Ioc
handler. Here is the code:
using CommunityToolkit.Mvvm.DependencyInjection; namespace MauiTestApp { public class MyMauiAppImpl : Microsoft.Maui.Controls.Application { public MyMauiAppImpl(IServiceProvider services) { Ioc.Default.ConfigureServices(services); } } }
Usage
Using the class is straight forward. Open your App.xaml
file and replace the Application base with your MyMauiAppImpl
:
<local:MyMauiAppImpl xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:MauiTestApp" x:Class="MauiTestApp.App"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Resources/Styles/Colors.xaml" /> <ResourceDictionary Source="Resources/Styles/Styles.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </local:MyMauiAppImpl>
And, of course, the same goes for the code behind-file App.xaml.cs
:
namespace MauiTestApp; public partial class App : MyMauiAppImpl { public App(IServiceProvider serviceProvider) : base(serviceProvider) { InitializeComponent(); MainPage = new AppShell; } }
That’s it, you can now use the MVVM CommunityToolkit’s Ioc.Default
implementation to access the registered Services, ViewModels and Views.
Conclusion
In this post, I showed you a simple (and even easily reusable way) of making the IServiceProvider
of your .NET MAUI application available. I also linked to an alternative approach, if you do not want to subclass the application object, I recommend that way.
As always, I hope this post is helpful for some of you.