Introducción a DependencyService de Xamarin.FormsXamarin.Forms DependencyService Introduction

Descargar ejemplo Descargar el ejemploDownload Sample Download the sample

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.The DependencyService class is a service locator that enables Xamarin.Forms applications to invoke native platform functionality from shared code.

El proceso para usar DependencyService para invocar la funcionalidad nativa de la plataforma es el siguiente:The process for using the DependencyService to invoke native platform functionality is to:

  1. Cree una interfaz para la funcionalidad de la plataforma nativa en el código compartido.Create an interface for the native platform functionality, in shared code. Para más información, vea Creación de una interfaz.For more information, see Create an interface.
  2. Implemente la interfaz en los proyectos de la plataforma requeridos.Implement the interface in the required platform projects. Para obtener más información, vea Implementación de la interfaz en cada plataforma.For more information, see Implement the interface on each platform.
  3. Registro de las implementaciones de la plataforma con DependencyService.Register the platform implementations with the DependencyService. Esto permite que Xamarin.Forms localice las implementaciones de la plataforma en tiempo de ejecución.This enables Xamarin.Forms to locate the platform implementations at runtime. Para obtener más información, vea Registro de las implementaciones de la plataforma.For more information, see Register the platform implementations.
  4. Resuelva las implementaciones de la plataforma desde el código compartido e invóquelas.Resolve the platform implementations from shared code, and invoke them. Para obtener más información, vea Resolución de las implementaciones de la plataforma.For more information, see Resolve the platform implementations.

En el siguiente diagrama, se muestra cómo se invoca la funcionalidad nativa de la plataforma en una aplicación de Xamarin.Forms:The following diagram shows how native platform functionality is invoked in a Xamarin.Forms application:

Información general de la ubicación del servicio mediante la clase DependencyService de Xamarin.FormsOverview of service location using the Xamarin.Forms DependencyService class

Creación de una interfazCreate an interface

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.The first step in being able to invoke native platform functionality from shared code, is to create an interface that defines the API for interacting with the native platform functionality. Esta interfaz debe colocarse en su proyecto de código compartido.This interface should be placed in your shared code project.

En el ejemplo siguiente, se muestra una interfaz para una API que puede usarse para recuperar la orientación de un dispositivo:The following example shows an interface for an API that can be used to retrieve the orientation of a device:

public interface IDeviceOrientationService
{
    DeviceOrientation GetOrientation();
}

Implementación de la interfaz en cada plataformaImplement the interface on each platform

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.After creating the interface that defines the API for interacting with the native platform functionality, the interface must be implemented in each platform project.

iOSiOS

En el siguiente ejemplo de código, se muestra la implementación de la interfaz de IDeviceOrientationService en iOS:The following code example shows the implementation of the IDeviceOrientationService interface on 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;
        }
    }
}

AndroidAndroid

En el siguiente ejemplo de código, se muestra la implementación de la interfaz de IDeviceOrientationService en Android:The following code example shows the implementation of the IDeviceOrientationService interface on 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 WindowsUniversal Windows Platform

En el siguiente ejemplo de código, se muestra la implementación de la interfaz de IDeviceOrientationService en la Plataforma universal de Windows (UWP):The following code example shows the implementation of the IDeviceOrientationService interface on the Universal Windows Platform (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 plataformaRegister the platform implementations

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.After implementing the interface in each platform project, the platform implementations must be registered with the DependencyService, so that Xamarin.Forms can locate them at runtime. Normalmente, esto se realiza con DependencyAttribute, lo que indica que el tipo especificado proporciona una implementación de la interfaz.This is typically performed with the DependencyAttribute, which indicates that the specified type provides an implementation of the interface.

En el siguiente ejemplo se muestra el uso de DependencyAttribute para registrar la implementación en iOS de la interfaz de IDeviceOrientationService:The following example shows using the DependencyAttribute to register the iOS implementation of the IDeviceOrientationService interface:

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.In this example, the DependencyAttribute registers the DeviceOrientationService with the DependencyService. De forma similar, las implementaciones de la interfaz de IDeviceOrientationService en otras plataformas se debe registrar con DependencyAttribute.Similarly, the implementations of the IDeviceOrientationService interface on other platforms should be registered with the 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.For more information about registering platform implementations with the DependencyService, see Xamarin.Forms DependencyService Registration and Resolution.

Resolución de las implementaciones de la plataformaResolve the platform implementations

Tras el registro de las implementaciones de la plataforma con DependencyService, las implementaciones deberán resolverse antes de invocarse.Following registration of platform implementations with the DependencyService, the implementations must be resolved before being invoked. Normalmente, esto se realiza en código compartido mediante el método DependencyService.Get<T>.This is typically performed in shared code using the DependencyService.Get<T> method.

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:The following code shows an example of calling the Get<T> method to resolve the IDeviceOrientationService interface, and then invoking its GetOrientation method:

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

Como alternativa, este código se puede comprimir en una sola línea:Alternatively, this code can be condensed into a single line:

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

Para obtener más información sobre la resolución de las implementaciones de la plataforma con DependencyService, vea Registro y resolución de DependencyService de Xamarin.Forms.For more information about resolving platform implementations with the DependencyService, see Xamarin.Forms DependencyService Registration and Resolution.