Xamarin.Forms Introduzione a DependencyService

Download Sample Scaricare l'esempio

La DependencyService classe è un localizzatore di servizi che consente alle applicazioni di Xamarin.Forms richiamare funzionalità della piattaforma nativa dal codice condiviso.

La procedura per usare DependencyService per richiamare la funzionalità della piattaforma nativa prevede i passaggi seguenti:

  1. Creare un'interfaccia per la funzionalità della piattaforma nativa nel codice condiviso. Per altre informazioni, vedere Creare un'interfaccia.
  2. Implementare l'interfaccia nei progetti di piattaforma richiesti. Per altre informazioni, vedere Implementare l'interfaccia in ogni piattaforma.
  3. Registrare le implementazioni della piattaforma con DependencyService. In questo modo è possibile Xamarin.Forms individuare le implementazioni della piattaforma in fase di esecuzione. Per altre informazioni, vedere Registrare le implementazioni della piattaforma.
  4. Risolvere le implementazioni della piattaforma dal codice condiviso e richiamarle. Per altre informazioni, vedere Risolvere le implementazioni della piattaforma.

Il diagramma seguente illustra come viene richiamata la funzionalità della piattaforma nativa in un'applicazione Xamarin.Forms :

Overview of service location using the Xamarin.Forms DependencyService class

Creare un'interfaccia

Il primo passaggio per riuscire a richiamare la funzionalità della piattaforma nativa dal codice condiviso consiste nel creare un'interfaccia che definisce l'API per l'interazione con la funzionalità della piattaforma nativa. Questa interfaccia deve essere inserita nel progetto del codice condiviso.

L'esempio seguente mostra un'interfaccia per un'API che può essere usata per recuperare l'orientamento di un dispositivo:

public interface IDeviceOrientationService
{
    DeviceOrientation GetOrientation();
}

Implementare l'interfaccia in ogni piattaforma

Dopo aver creato l'interfaccia che definisce l'API per l'interazione con la funzionalità della piattaforma nativa, l'interfaccia deve essere implementata nel progetto di ogni piattaforma.

iOS

L'esempio di codice seguente mostra l'implementazione dell'interfaccia IDeviceOrientationService in 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

L'esempio di codice seguente mostra l'implementazione dell'interfaccia IDeviceOrientationService in 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;
        }
    }
}

Piattaforma UWP (Universal Windows Platform)

L'esempio di codice seguente mostra l'implementazione dell'interfaccia IDeviceOrientationService per la piattaforma UWP (Universal Windows Platform):

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

Registrare le implementazioni della piattaforma

Dopo aver implementato l'interfaccia in ogni progetto di piattaforma, le implementazioni della piattaforma devono essere registrate con DependencyService, in modo che Xamarin.Forms possano individuarle in fase di esecuzione. Questa operazione viene in genere eseguita con DependencyAttribute, che indica che il tipo specificato fornisce un'implementazione dell'interfaccia.

L'esempio seguente illustra l'uso di DependencyAttribute per registrare l'implementazione di iOS dell'interfaccia IDeviceOrientationService:

using Xamarin.Forms;

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

In questo esempio, DependencyAttribute registra DeviceOrientationService con DependencyService. Analogamente, le implementazioni dell'interfaccia IDeviceOrientationService in altre piattaforme devono essere registrate con DependencyAttribute.

Per altre informazioni sulla registrazione delle implementazioni della piattaforma con , vedere DependencyService Registration and Resolution.For more information about registring platform implementations with the DependencyService, see Xamarin.Forms DependencyService Registration and Resolution.

Risolvere le implementazioni della piattaforma

Dopo la registrazione delle implementazioni della piattaforma con DependencyService, le implementazioni devono essere risolte prima di poter essere richiamate. Questa operazione viene in genere eseguita nel codice condiviso tramite il metodo DependencyService.Get<T>.

Il codice seguente mostra un esempio della chiamata del metodo Get<T> per risolvere l'interfaccia IDeviceOrientationService e della chiamata del relativo metodo GetOrientation:

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

Questo codice può essere in alternativa compresso in una singola riga:

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

Per altre informazioni sulla risoluzione delle implementazioni della piattaforma con , vedere DependencyService Registration and Resolution.For more information about resolving platform implementations with the DependencyService, see Xamarin.Forms DependencyService Registration and Resolution.