Xamarin.Forms Introdução ao DependencyService

Baixar exemplo Baixar o exemplo

A DependencyService classe é um localizador de serviço que permite que os Xamarin.Forms aplicativos invoquem a funcionalidade de plataforma nativa do código compartilhado.

O processo para usar o DependencyService para invocar a funcionalidade de plataforma nativa é:

  1. Crie uma interface para a funcionalidade de plataforma nativa, em código compartilhado. Para obter mais informações, confira Criar uma interface.
  2. Implemente a interface nos projetos de plataforma necessários. Para obter mais informações, confira Implementar a interface em cada plataforma.
  3. Registrar as implementações de plataforma no DependencyService. Isso permite Xamarin.Forms localizar as implementações da plataforma em runtime. Para obter mais informações, confira Registrar as implementações de plataforma.
  4. Resolva as implementações de plataforma de um código compartilhado e as invoque. Para obter mais informações, confira Resolver as implementações de plataforma.

O diagrama a seguir mostra como a funcionalidade da plataforma nativa é invocada em um Xamarin.Forms aplicativo:

Visão geral do local do serviço usando o Xamarin.Forms Local do serviço DependencyService da classe DependencyService

Criar uma interface

A primeira etapa em ser capaz de invocar a funcionalidade de plataforma nativa de um código compartilhado é criar uma interface que defina a API para interagir com a funcionalidade de plataforma nativa. Essa interface deve ser colocada em seu projeto de código compartilhado.

O exemplo a seguir mostra uma interface para uma API que pode ser usada para recuperar a orientação de um dispositivo:

public interface IDeviceOrientationService
{
    DeviceOrientation GetOrientation();
}

Implementar a interface em cada plataforma

Depois de criar a interface que define a API para interagir com a funcionalidade de plataforma nativa, a interface deverá ser implementada em cada projeto de plataforma.

iOS

O exemplo de código a seguir mostra a implementação da interface IDeviceOrientationService no 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

O exemplo de código a seguir mostra a implementação da interface IDeviceOrientationService no 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;
        }
    }
}

Plataforma Universal do Windows

O exemplo de código a seguir mostra a implementação da interface IDeviceOrientationService na UWP (Plataforma Universal do Windows):

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

Registrar as implementações de plataforma

Depois de implementar a interface em cada projeto de plataforma, as implementações de plataforma devem ser registradas com o DependencyService, para que Xamarin.Forms possam localizá-las em runtime. Isso normalmente é executado com o DependencyAttribute, o que indica que o tipo especificado fornece uma implementação da interface.

O exemplo a seguir mostra o uso do DependencyAttribute para registrar a implementação do iOS da interface IDeviceOrientationService:

using Xamarin.Forms;

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

Neste exemplo, o DependencyAttribute registra o DeviceOrientationService com o DependencyService. Da mesma forma, as implementações da interface IDeviceOrientationService em outras plataformas devem ser registradas com o DependencyAttribute.

Para obter mais informações sobre como registrar implementações de plataforma com o DependencyService, consulte Xamarin.Forms DependencyService Registration and Resolution.

Resolver as implementações da plataforma

Após o registro das implementações de plataforma com o DependencyService, as implementações deverão ser resolvidas antes de serem invocadas. Isso normalmente é feito no código compartilhado, usando o método DependencyService.Get<T>.

O código a seguir mostra um exemplo de chamada ao método Get<T> para resolver a interface IDeviceOrientationService e, em seguida, invocação de seu método GetOrientation:

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

Como alternativa, esse código pode ser condensado em uma única linha:

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

Para obter mais informações sobre como resolver implementações de plataforma com o DependencyService, consulte Xamarin.Forms DependencyService Registration and Resolution.