Compartir vía


Introducción a DependencyService de Xamarin.Forms

La clase DependencyService es un localizador de servicios que habilita las aplicaciones de Xamarin.Forms para invocar la funcionalidad nativa de la plataforma desde código compartido.

El proceso para usar DependencyService para invocar la funcionalidad nativa de la plataforma es el siguiente:

  1. Cree una interfaz para la funcionalidad de la plataforma nativa en el código compartido. Para más información, vea Creación de una interfaz.
  2. Implemente la interfaz en los proyectos de la plataforma requeridos. Para obtener más información, vea Implementación de la interfaz en cada plataforma.
  3. Registro de las implementaciones de la plataforma con DependencyService. Esto permite que Xamarin.Forms localice las implementaciones de la plataforma en tiempo de ejecución. Para obtener más información, vea Registro de las implementaciones de la plataforma.
  4. Resuelva las implementaciones de la plataforma desde el código compartido e invóquelas. Para obtener más información, vea Resolución de las implementaciones de la plataforma.

En el siguiente diagrama, se muestra cómo se invoca la funcionalidad nativa de la plataforma en una aplicación de Xamarin.Forms:

Información general de la ubicación del servicio mediante la clase DependencyService de Xamarin.Forms

Creación de una interfaz

El primer paso para poder invocar la funcionalidad nativa de la plataforma desde código compartido es crear una interfaz que defina la API para interactuar con la funcionalidad nativa de la plataforma. Esta interfaz debe colocarse en su proyecto de código compartido.

En el ejemplo siguiente, se muestra una interfaz para una API que puede usarse para recuperar la orientación de un dispositivo:

public interface IDeviceOrientationService
{
    DeviceOrientation GetOrientation();
}

Implementación de la interfaz en cada plataforma

Después de crear la interfaz que define la API para interactuar con la funcionalidad nativa de la plataforma, la interfaz deberá implementarse en cada proyecto de la plataforma.

iOS

En el siguiente ejemplo de código, se muestra la implementación de la interfaz de IDeviceOrientationService en 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

En el siguiente ejemplo de código, se muestra la implementación de la interfaz de IDeviceOrientationService en 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 de Windows

En el siguiente ejemplo de código, se muestra la implementación de la interfaz de IDeviceOrientationService en la Plataforma universal de 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;
        }
    }
}

Registro de las implementaciones de la plataforma

Después de implementar la interfaz en cada proyecto de la plataforma, las implementaciones de la plataforma deberán registrarse con DependencyService para que Xamarin.Forms pueda ubicarlas en tiempo de ejecución. Normalmente, esto se realiza con DependencyAttribute, lo que indica que el tipo especificado proporciona una implementación de la interfaz.

En el siguiente ejemplo se muestra el uso de DependencyAttribute para registrar la implementación en iOS de la interfaz de IDeviceOrientationService:

using Xamarin.Forms;

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

En este ejemplo, DependencyAttribute registra DeviceOrientationService con DependencyService. De forma similar, las implementaciones de la interfaz de IDeviceOrientationService en otras plataformas se debe registrar con DependencyAttribute.

Para obtener más información sobre el registro de implementaciones de plataforma con DependencyService, vea Registro y resolución de DependencyService de Xamarin.Forms.

Resolución de las implementaciones de la plataforma

Tras el registro de las implementaciones de la plataforma con DependencyService, las implementaciones deberán resolverse antes de invocarse. Normalmente, esto se realiza en código compartido mediante el método DependencyService.Get<T>.

En el código siguiente, se muestra un ejemplo de llamada al método Get<T> para resolver la interfaz de IDeviceOrientationService y, después, invocar su método GetOrientation:

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

Como alternativa, este código se puede comprimir en una sola línea:

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

Para obtener más información sobre la resolución de implementaciones de plataforma con DependencyService, vea Registro y resolución de DependencyService de Xamarin.Forms.