Общие сведения о Xamarin.Forms DependencyService
Класс DependencyService
— это указатель служб, который позволяет приложениям Xamarin.Forms вызывать собственные функции платформы из общего кода.
Использование DependencyService
для вызова собственных функций платформы включает следующее:
- Создание интерфейса для собственных функций платформы в общем коде. Дополнительные сведения см. в разделе Создание интерфейса.
- Реализацию интерфейса в требуемых проектах платформы. Дополнительные сведения см. в разделе Реализация интерфейса для каждой платформы.
- Регистрацию реализаций платформы в
DependencyService
. Это позволяет Xamarin.Forms найти реализации платформы во время выполнения. Дополнительные сведения см. в разделе Регистрация реализаций платформы. - Разрешение реализаций платформы из общего кода и их вызов. Дополнительные сведения см. в разделе Разрешение реализаций платформы.
На следующей схеме показано, как собственные функции платформы вызываются в приложении Xamarin.Forms.
Выбор интерфейса
Чтобы обеспечить возможность вызова собственных функций платформы из общего кода, сперва нужно создать интерфейс, который определяет API для взаимодействия с собственными функциями платформы. Этот интерфейс должен находиться в проекте с общим кодом.
Следующий пример демонстрирует интерфейс для API, который может использоваться для получения данных об ориентации устройства:
public interface IDeviceOrientationService
{
DeviceOrientation GetOrientation();
}
Реализация интерфейса для каждой платформы
Созданный интерфейс, определяющий API для взаимодействия с собственными функциями платформы, необходимо реализовать в каждом проекте платформы.
iOS
В следующем примере кода показана реализация интерфейса IDeviceOrientationService
для 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
В следующем примере кода показана реализация интерфейса IDeviceOrientationService
для 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;
}
}
}
Универсальная платформа Windows
В следующем примере кода показана реализация интерфейса IDeviceOrientationService
для универсальной платформы 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;
}
}
}
Регистрация реализаций платформы
После реализации интерфейса в каждом проекте платформы необходимо зарегистрировать реализации платформы в DependencyService
, чтобы платформа Xamarin.Forms могла находить их во время выполнения. Обычно это делается с помощью класса DependencyAttribute
, который указывает, что заданный тип предоставляет реализацию интерфейса.
В следующем примере демонстрируется использование DependencyAttribute
для регистрации реализации интерфейса IDeviceOrientationService
для iOS.
using Xamarin.Forms;
[assembly: Dependency(typeof(DependencyServiceDemos.iOS.DeviceOrientationService))]
namespace DependencyServiceDemos.iOS
{
public class DeviceOrientationService : IDeviceOrientationService
{
public DeviceOrientation GetOrientation()
{
...
}
}
}
В этом примере DependencyAttribute
регистрирует DeviceOrientationService
в DependencyService
. Аналогичным образом реализации интерфейса IDeviceOrientationService
на других платформах должны быть зарегистрированы с помощью DependencyAttribute
.
Дополнительные сведения о регистрации реализаций платформы в DependencyService
см. в статье Регистрация и разрешение класса Xamarin.Forms DependencyService.
Разрешение реализаций платформы
Зарегистрированные реализации платформы в DependencyService
необходимо разрешить до их вызова. Обычно это делается в общем коде с помощью метода DependencyService.Get<T>
.
Следующий пример кода демонстрирует вызов метода Get<T>
для разрешения интерфейса IDeviceOrientationService
и последующего вызова его метода GetOrientation
:
IDeviceOrientationService service = DependencyService.Get<IDeviceOrientationService>();
DeviceOrientation orientation = service.GetOrientation();
Этот код можно сократить до одной строки:
DeviceOrientation orientation = DependencyService.Get<IDeviceOrientationService>().GetOrientation();
Дополнительные сведения о разрешении реализаций платформы в DependencyService
см. в статье Регистрация и разрешение класса Xamarin.Forms DependencyService.