Make the IServiceProvider of your MAUI application accessible with the MVVM CommunityToolkit
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:
1
2
3
4
5
6
7
8
9
10
11
12
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
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<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
:
1
2
3
4
5
6
7
8
9
10
11
12
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.