.Net Maui Using Dependencyservice And Iplatformservice Complete Guide
Understanding the Core Concepts of .NET MAUI Using DependencyService and IPlatformService
.NET MAUI Using DependencyService and IPlatformService
DependencyService Overview
DependencyService
is a service locator that simplifies the process of instantiating platform-specific classes that adhere to a shared interface. This approach allows developers to write platform-agnostic code while still accessing platform-specific features.
Key Tasks of DependencyService
- Interface Definition: Define an interface in the shared project that outlines the methods you want to implement in platform-specific projects.
- Implementation: Implement the interface in each platform project.
- Resolution: Use
DependencyService.Register<T>()
to register services andDependencyService.Get<T>()
to resolve them.
Example Usage
- Define an Interface in Shared Project
public interface IToast
{
void MakeToast(string message);
}
- Implement Interface on iOS
using UserNotifications;
using Foundation;
[assembly: Xamarin.Forms.Dependency(typeof(Toast_iOS))]
public class Toast_iOS : IToast
{
public void MakeToast(string message)
{
var notification = new UNMutableNotificationContent();
notification.Title = "Note:";
notification.Body = message;
var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger(1, false);
var request = UNNotificationRequest.FromIdentifier("toast", notification, trigger);
UNUserNotificationCenter.Current.AddNotificationRequest(request, (err) => {
if (err != null)
Console.WriteLine(err.LocalizedDescription);
});
}
}
- Implement Interface on Android
using Android.Widget;
using Xamarin.Forms;
[assembly: Dependency(typeof(Toast_Droid))]
public class Toast_Droid : IToast
{
public void MakeToast(string message)
{
Toast.MakeText(Android.App.Application.Context, message, ToastLength.Short).Show();
}
}
- Resolve Interface in Shared Code
public void ShowToast(string message)
{
DependencyService.Get<IToast>().MakeToast(message);
}
IPlatformService Overview
IPlatformService
is a newer addition in .NET 7, designed to provide a practical framework for accessing platform-specific features with enhanced type safety and maintainability. Unlike DependencyService
, IPlatformService
offers a more streamlined approach by leveraging HRESULTs and easier-to-read method signatures.
Key Features of IPlatformService
- Strongly Typed: Methods return strongly-typed results, reducing errors related to loose typing.
- Error Handling: Supports more robust error handling through HRESULTs.
- Modern API: Follows modern .NET patterns and best practices.
Example Usage
- Define an Interface Using IPlatformService
Online Code run
Step-by-Step Guide: How to Implement .NET MAUI Using DependencyService and IPlatformService
Prerequisites
- .NET MAUI Installed: Ensure you have the latest version of .NET MAUI installed in your Visual Studio.
- Basic Knowledge: Familiarity with C#, XAML, and .NET MAUI is helpful.
Step 1: Create a New .NET MAUI Project
- Open Visual Studio.
- Create a New Project:
- Go to
File
>New
>Project
. - Select
MAUI App (.NET 6+/.NET Standard 2.0)
. - Click
Next
.
- Go to
- Configure the Project:
- Enter your project name, e.g.,
MauiDependencyServiceExample
. - Choose a location and click
Create
.
- Enter your project name, e.g.,
- Solution Structure:
- Your solution will contain platform-specific projects (e.g.,
MauiDependencyServiceExample.Android
,MauiDependencyServiceExample.iOS
, etc.).
- Your solution will contain platform-specific projects (e.g.,
Step 2: Define the Interface IPlatformService
Create an interface that will define the platform-specific functionality you want to expose. In this example, we'll create a simple service to show a platform-specific message.
- Add a New Interface:
- Right-click on the
MauiDependencyServiceExample
(Shared) project. - Go to
Add
>New Item
. - Select
Interface
and name itIPlatformService.cs
.
- Right-click on the
- Define the Method:
using System.Threading.Tasks; namespace MauiDependencyServiceExample { public interface IPlatformService { Task ShowPlatformMessage(string message); } }
Step 3: Implement IPlatformService
for Android
- Add a New Class:
- Navigate to the
MauiDependencyServiceExample.Android
project. - Right-click the project and select
Add
>New Item
. - Choose
Class
and name itPlatformServiceAndroid.cs
.
- Navigate to the
- Implement the Interface:
using Android.App; using Android.Widget; using MauiDependencyServiceExample; using System.Threading.Tasks; [assembly: Xamarin.Forms.Dependency(typeof(PlatformServiceAndroid))] namespace MauiDependencyServiceExample.Droid { public class PlatformServiceAndroid : IPlatformService { public Task ShowPlatformMessage(string message) { RunOnUiThread(() => { Toast.MakeText(Application.Context, message, ToastLength.Short).Show(); }); return Task.CompletedTask; } private void RunOnUiThread(Action action) { Application.SynchronizationContext.Post(_ => action?.Invoke(), null); } } }
Step 4: Implement IPlatformService
for iOS
- Add a New Class:
- Navigate to the
MauiDependencyServiceExample.iOS
project. - Right-click the project and select
Add
>New Item
. - Choose
Class
and name itPlatformServiceiOS.cs
.
- Navigate to the
- Implement the Interface:
using MauiDependencyServiceExample; using UIKit; using System.Threading.Tasks; [assembly: Xamarin.Forms.Dependency(typeof(PlatformServiceiOS))] namespace MauiDependencyServiceExample.iOS { public class PlatformServiceiOS : IPlatformService { public Task ShowPlatformMessage(string message) { UIKit.UIThread.RunBackground(() => { UIKit.UIThread.RunOnMain(() => { var alertController = UIAlertController.Create(null, message, UIAlertControllerStyle.Alert); alertController.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null)); UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(alertController, true, null); }); }); return Task.CompletedTask; } } }
Step 5: Use DependencyService
in the Shared Code
Now, let's use DependencyService
to invoke the platform-specific method from the shared code.
Modify
MainPage.xaml
:<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="MauiDependencyServiceExample.MainPage" Title="Maui DependencyService Example"> <StackLayout Padding="20"> <Label Text="Welcome to Maui!" HorizontalTextAlignment="Center" FontSize="24" Margin="0,0,0,20"/> <Button Text="Show Platform Message" Clicked="OnShowPlatformMessageClicked" HorizontalOptions="CenterAndExpand" BackgroundColor="#007AFF" TextColor="White"/> </StackLayout> </ContentPage>
Modify
MainPage.xaml.cs
:using MauiDependencyServiceExample; using Microsoft.Maui.Controls; using System.Threading.Tasks; namespace MauiDependencyServiceExample { public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); } private async void OnShowPlatformMessageClicked(object sender, System.EventArgs e) { // Resolve the platform-specific service var platformService = DependencyService.Get<IPlatformService>(); // Invoke the platform-specific method await platformService.ShowPlatformMessage("Hello from .NET MAUI!"); } } }
Step 6: Run the Application
- Select a Platform: Choose the platform you want to run the app on (e.g., Android, iOS).
- Deploy the App:
- Android: Connect an Android device or use an emulator.
- iOS: Use a Mac with Xcode or an iPhone/iPad.
- Run the App: Click the green play button in Visual Studio.
Expected Output:
- Android: A toast message saying "Hello from .NET MAUI!" will appear.
- iOS: An alert dialog with the message "Hello from .NET MAUI!" will be displayed.
Summary
You have successfully created a .NET MAUI application that uses DependencyService
to invoke platform-specific functionality through an interface (IPlatformService
). This approach allows you to write shared code while accessing native capabilities on each platform.
Login to post a comment.