Einführung in Xamarin.Forms-DependencyService

Die DependencyService-Klasse ist ein Dienstlocator, der es Xamarin.Forms-Anwendungen ermöglicht, native Plattformfunktionen aus freigegebenem Code aufzurufen.

Zum Aufrufen der nativen Plattformfunktionalität wird DependencyService wie folgt verwendet:

  1. Erstellen Sie eine Schnittstelle für die native Plattformfunktionalität in freigegebenem Code. Weitere Informationen finden Sie unter Erstellen einer Schnittstelle.
  2. Implementieren Sie die Schnittstelle in den erforderlichen Plattformprojekten. Weitere Informationen finden Sie unter Implementieren der Schnittstelle in den einzelnen Plattformen.
  3. Registrieren Sie die Plattformimplementierungen mit der DependencyService-Klasse. Hierdurch können die Plattformimplementierungen zur Laufzeit in Xamarin.Forms gefunden werden. Weitere Informationen finden Sie unter Registrieren der Plattformimplementierungen.
  4. Lösen Sie die Plattformimplementierungen aus freigegebenem Code auf, und rufen Sie diese auf. Weitere Informationen finden Sie unter Auflösen der Plattformimplementierungen.

Im folgenden Diagramm wird gezeigt, wie die nativen Plattformfunktionen in einer Xamarin.Forms-Anwendung aufgerufen werden:

Übersicht über den Dienststandort mithilfe der Xamarin.Forms DependencyService-Klasse

Erstellen einer Schnittstelle

Der erste Schritt, um die native Plattformfunktionalität aus freigegebenem Code aufrufen zu können, besteht darin, eine Schnittstelle zu erstellen, die die API für die Interaktion mit der nativen Plattformfunktionalität definiert. Diese Schnittstelle sollte in Ihr Projekt mit freigegebenem Code platziert werden.

Im folgenden Beispiel sehen Sie eine Schnittstelle für eine API, mit der die Ausrichtung eines Geräts abgerufen werden kann:

public interface IDeviceOrientationService
{
    DeviceOrientation GetOrientation();
}

Implementieren der Schnittstelle in den einzelnen Plattformen

Nach dem Erstellen der Schnittstelle, die die API für die Interaktion mit der nativen Plattformfunktionalität definiert, muss die Schnittstelle in den einzelnen Plattformprojekten implementiert werden.

iOS

Im folgenden Codebeispiel wird die Implementierung der IDeviceOrientationService-Schnittstelle unter iOS veranschaulicht:

namespace DependencyServiceDemos.iOS
{
    public class DeviceOrientationService : IDeviceOrientationService
    {
        public DeviceOrientation GetOrientation()
        {
            UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;

            bool isPortrait = orientation == UIInterfaceOrientation.Portrait ||
                orientation == UIInterfaceOrientation.PortraitUpsideDown;
            return isPortrait ? DeviceOrientation.Portrait : DeviceOrientation.Landscape;
        }
    }
}

Android

Im folgenden Codebeispiel wird die Implementierung der IDeviceOrientationService-Schnittstelle unter Android veranschaulicht:

namespace DependencyServiceDemos.Droid
{
    public class DeviceOrientationService : IDeviceOrientationService
    {
        public DeviceOrientation GetOrientation()
        {
            IWindowManager windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();

            SurfaceOrientation orientation = windowManager.DefaultDisplay.Rotation;
            bool isLandscape = orientation == SurfaceOrientation.Rotation90 ||
                orientation == SurfaceOrientation.Rotation270;
            return isLandscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
        }
    }
}

Universelle Windows-Plattform

Im folgenden Codebeispiel wird die Implementierung der IDeviceOrientationService-Schnittstelle für die Universelle Windows-Plattform (UWP) veranschaulicht:

namespace DependencyServiceDemos.UWP
{
    public class DeviceOrientationService : IDeviceOrientationService
    {
        public DeviceOrientation GetOrientation()
        {
            ApplicationViewOrientation orientation = ApplicationView.GetForCurrentView().Orientation;
            return orientation == ApplicationViewOrientation.Landscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
        }
    }
}

Registrieren der Plattformimplementierungen

Nach dem Implementieren der Schnittstelle in den einzelnen Plattformprojekten müssen die Plattformimplementierungen mit DependencyService registriert werden, damit diese in Xamarin.Forms zur Laufzeit gefunden werden können. Dies wird typischerweise mit DependencyAttribute durchgeführt, was bedeutet, dass der angegebene Typ eine Implementierung der Schnittstelle bereitstellt.

Im folgenden Beispiel wird veranschaulicht, wie mithilfe von DependencyAttribute die iOS-Implementierung der IDeviceOrientationService-Schnittstelle registriert wird:

using Xamarin.Forms;

[assembly: Dependency(typeof(DependencyServiceDemos.iOS.DeviceOrientationService))]
namespace DependencyServiceDemos.iOS
{
    public class DeviceOrientationService : IDeviceOrientationService
    {
        public DeviceOrientation GetOrientation()
        {
            ...
        }
    }
}

In diesem Beispiel wird DeviceOrientationService von DependencyAttribute mit der DependencyService-Klasse registriert. Gleichermaßen sollten die Implementierungen der IDeviceOrientationService-Schnittstelle auf anderen Plattformen mit der DependencyAttribute-Klasse registriert werden.

Weitere Informationen zum Registrieren von Plattformimplementierungen mit der DependencyService-Klasse finden Sie unter DependencyService-Registrierung und -Auflösung in Xamarin.Forms.

Auflösen der Plattformimplementierungen

Nach der Registrierung von Plattformimplementierungen bei DependencyService müssen die Implementierungen vor dem Aufruf aufgelöst werden. Dies erfolgt in der Regel im freigegebenen Code mithilfe der DependencyService.Get<T>-Methode.

Im folgenden Code ist ein Beispiel für den Aufruf der Get<T>-Methode zur Auflösung der IDeviceOrientationService-Schnittstelle und den anschließenden Aufruf der GetOrientation-Methode dargestellt:

IDeviceOrientationService service = DependencyService.Get<IDeviceOrientationService>();
DeviceOrientation orientation = service.GetOrientation();

Alternativ kann dieser Code auf eine einzige Zeile verkürzt werden:

DeviceOrientation orientation = DependencyService.Get<IDeviceOrientationService>().GetOrientation();

Weitere Informationen zum Auflösen von Plattformimplementierungen mit der DependencyService-Klasse finden Sie unter DependencyService-Registrierung und -Auflösung in Xamarin.Forms.