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:
- 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.
- 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.
- 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. - 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:
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.