Xamarin.Forms Wprowadzenie do usługi DependencyService

Download Sample Pobieranie przykładu

Klasa DependencyService to lokalizator usług, który umożliwia Xamarin.Forms aplikacjom wywoływanie natywnych funkcji platformy z kodu udostępnionego.

Proces używania elementu DependencyService do wywoływania natywnej funkcjonalności platformy to:

  1. Utwórz interfejs dla funkcji platformy natywnej w kodzie udostępnionym. Aby uzyskać więcej informacji, zobacz Tworzenie interfejsu.
  2. Zaimplementuj interfejs w wymaganych projektach platformy. Aby uzyskać więcej informacji, zobacz Implementowanie interfejsu na każdej platformie.
  3. Zarejestruj implementacje platformy za pomocą polecenia DependencyService. Umożliwia Xamarin.Forms to zlokalizowanie implementacji platformy w czasie wykonywania. Aby uzyskać więcej informacji, zobacz Rejestrowanie implementacji platformy.
  4. Rozwiąż implementacje platformy z kodu udostępnionego i wywołaj je. Aby uzyskać więcej informacji, zobacz Rozwiązywanie problemów z implementacjami platformy.

Na poniższym diagramie pokazano, jak funkcja natywnej Xamarin.Forms platformy jest wywoływana w aplikacji:

Overview of service location using the Xamarin.Forms DependencyService class

Tworzenie interfejsu

Pierwszym krokiem w celu wywołania natywnej funkcjonalności platformy z kodu udostępnionego jest utworzenie interfejsu definiującego interfejs API do interakcji z natywną funkcjonalnością platformy. Ten interfejs powinien zostać umieszczony w projekcie kodu udostępnionego.

Poniższy przykład przedstawia interfejs interfejsu API, który może służyć do pobierania orientacji urządzenia:

public interface IDeviceOrientationService
{
    DeviceOrientation GetOrientation();
}

Implementowanie interfejsu na każdej platformie

Po utworzeniu interfejsu definiującego interfejs API do interakcji z natywną funkcjonalnością platformy interfejs musi zostać zaimplementowany w każdym projekcie platformy.

iOS

Poniższy przykład kodu przedstawia implementację interfejsu IDeviceOrientationService w systemie iOS:

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

Poniższy przykład kodu przedstawia implementację interfejsu IDeviceOrientationService w systemie Android:

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;
        }
    }
}

Platforma uniwersalna systemu Windows

Poniższy przykład kodu przedstawia implementację interfejsu IDeviceOrientationService na platformie platforma uniwersalna systemu Windows (UWP):

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

Rejestrowanie implementacji platformy

Po zaimplementowaniu interfejsu w każdym projekcie platformy implementacje platformy muszą być zarejestrowane w DependencyServiceobiekcie , aby Xamarin.Forms można je było zlokalizować w czasie wykonywania. Jest to zwykle wykonywane z elementem DependencyAttribute, który wskazuje, że określony typ zapewnia implementację interfejsu.

W poniższym przykładzie pokazano użycie elementu DependencyAttribute , aby zarejestrować implementację interfejsu dla IDeviceOrientationService systemu iOS:

using Xamarin.Forms;

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

W tym przykładzie element rejestruje element DependencyAttributeDeviceOrientationService za pomocą elementu DependencyService. Podobnie implementacje interfejsu IDeviceOrientationService na innych platformach powinny być zarejestrowane w programie DependencyAttribute.

Aby uzyskać więcej informacji na temat rejestrowania implementacji platformy w programie , zobaczXamarin.FormsDependencyService Registration and Resolution (Rejestracja i rozwiązywanie problemów z usługą DependencyServiceDependencyService).

Rozwiązywanie problemów z implementacjami platformy

Po zarejestrowaniu implementacji platformy za DependencyServicepomocą polecenia należy rozwiązać implementacje przed wywołaniem. Jest to zwykle wykonywane w kodzie udostępnionym DependencyService.Get<T> przy użyciu metody .

Poniższy kod przedstawia przykład wywołania Get<T> metody w celu rozpoznania interfejsu IDeviceOrientationService , a następnie wywołania jej GetOrientation metody:

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

Alternatywnie ten kod można skondensować w jednym wierszu:

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

Aby uzyskać więcej informacji na temat rozwiązywania implementacji platformy za pomocą programu DependencyService, zobacz Xamarin.Forms DependencyService Registration and Resolution (Rejestracja i rozwiązywanie problemów z usługą DependencyService).