Xamarin.Forms DependencyService 등록 및 확인

Download Sample 샘플 다운로드

네이 Xamarin.FormsDependencyService 티브 플랫폼 기능을 호출하는 데 사용하는 경우 플랫폼 구현을 등록 DependencyService한 다음 공유 코드에서 확인하여 호출해야 합니다.

플랫폼 구현 등록

DependencyService에 플랫폼 구현을 등록해야 Xamarin.Forms가 런타임에 해당 구현을 찾을 수 있습니다.

DependencyAttribute 또는 RegisterRegisterSingleton 메서드를 사용하여 등록을 수행할 수 있습니다.

Important

.NET 네이티브 컴파일을 사용하는 UWP 프로젝트의 릴리스 빌드는 Register 메서드를 사용하여 플랫폼 구현을 등록해야 합니다.

특성으로 등록

DependencyAttribute를 사용하여 DependencyService에 플랫폼 구현을 등록할 수 있습니다. 지정된 형식이 인터페이스의 구체적인 구현을 제공하는 것을 나타내는 특성입니다.

다음 예제에서는 DependencyAttribute를 사용하여 IDeviceOrientationService 인터페이스의 iOS 구현을 등록합니다.

using Xamarin.Forms;

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

이 예제에서 DependencyAttributeDependencyServiceDeviceOrientationService를 등록합니다. 결과적으로 구체적인 형식이 구현하는 인터페이스에 해당 형식이 등록됩니다.

마찬가지로 다른 플랫폼의 IDeviceOrientationService 인터페이스 구현은 DependencyAttribute를 사용하여 등록해야 합니다.

참고 항목

DependencyAttribute를 사용한 등록은 네임스페이스 수준에서 수행됩니다.

메서드로 등록

DependencyService.Register 메서드 및 RegisterSingleton 메서드를 사용하여 DependencyService에 플랫폼 구현을 등록할 수 있습니다.

다음 예제에서는 Register 메서드를 사용하여 IDeviceOrientationService 인터페이스의 iOS 구현을 등록합니다.

[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        global::Xamarin.Forms.Forms.Init();
        LoadApplication(new App());
        DependencyService.Register<IDeviceOrientationService, DeviceOrientationService>();
        return base.FinishedLaunching(app, options);
    }
}

이 예제에서 Register 메서드는 구체적인 형식 DeviceOrientationServiceIDeviceOrientationService 인터페이스에 등록합니다. 또는 Register 메서드의 오버로드를 사용하여 DependencyService에 플랫폼 구현을 등록할 수 있습니다.

DependencyService.Register<DeviceOrientationService>();

이 예제에서 Register 메서드는 DependencyServiceDeviceOrientationService를 등록합니다. 결과적으로 구체적인 형식이 구현하는 인터페이스에 해당 형식이 등록됩니다.

아니면, RegisterSingleton 메서드를 사용하여 기존 개체 인스턴스를 싱글톤으로 등록할 수도 있습니다.

var service = new DeviceOrientationService();
DependencyService.RegisterSingleton<IDeviceOrientationService>(service);

이 예에서 RegisterSingleton 메서드는 IDeviceOrientationService 인터페이스에 대해 DeviceOrientationService 개체를 싱글톤으로 등록합니다.

마찬가지로 다른 플랫폼의 IDeviceOrientationService 인터페이스 구현은 Register 메서드 또는 RegisterSingleton 메서드를 사용하여 등록해야 합니다.

Important

RegisterRegisterSingleton 메서드를 통한 등록을 플랫폼 프로젝트에서 수행한 후 플랫폼 구현이 제공하는 기능을 공유 코드에서 호출해야 합니다.

플랫폼 구현 확인

플랫폼 구현은 확인한 후 호출해야 합니다. 이 작업은 일반적으로 공유 코드에서 DependencyService.Get<T> 메서드를 사용하여 수행합니다. 그러나 DependencyService.Resolve<T> 메서드를 사용하여 수행할 수도 있습니다.

기본적으로 DependencyService는 매개 변수가 없는 생성자가 있는 플랫폼 구현만 확인합니다. 그러나 종속성 확인 메서드는 종속성 주입 컨테이너 또는 팩터리 메서드를 사용하여 플랫폼 구현을 확인하는 Xamarin.Forms에 주입할 수 있습니다. 이 방법은 매개 변수가 있는 생성자가 있는 가진 플랫폼 구현을 확인하는 데 사용할 수 있습니다. 자세한 내용은 Xamarin.Forms의 종속성 확인을 참조하세요.

Important

DependencyService에 등록되지 않은 플랫폼 구현을 호출하면 NullReferenceException이 throw됩니다.

Get<T> 메서드를 사용하여 확인

Get<T> 메서드는 런타임에 인터페이스 T의 플랫폼 구현을 검색하고 다음 중 하나를 수행합니다.

  • 이 구현의 인스턴스를 싱글톤으로 만듭니다.
  • 기존 인스턴스를 싱글톤으로 반환하며, 이는 RegisterSingleton 메서드로 DependencyService에 등록됩니다.

두 경우 모두 인스턴스는 애플리케이션의 수명 동안 유지되며 동일한 플랫폼 구현을 확인하는 후속 호출은 동일한 인스턴스를 검색합니다.

다음 코드는 Get<T> 메서드를 호출하여 IDeviceOrientationService 인터페이스를 확인한 후 해당 GetOrientation 메서드를 호출하는 예제를 보여 줍니다.

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

또는 이 코드를 다음 한 줄로 요약할 수 있습니다.

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

참고 항목

Get<T> 메서드는 기본적으로 인터페이스 T의 플랫폼 구현 인스턴스를 싱글톤으로 반환합니다. 그러나 이 동작을 변경할 수 있습니다. 자세한 내용은 확인된 개체의 수명 관리를 참조하세요.

Resolve<T> 메서드를 사용하여 확인

Resolve<T> 메서드는 DependencyResolver 클래스를 통해 Xamarin.Forms에 삽입된 종속성 확인 메서드를 사용하여 런타임에 인터페이스 T의 플랫폼 구현을 검색합니다. 종속성 확인 메서드가 Xamarin.Forms에 삽입되지 않은 경우 Resolve<T> 메서드는 플랫폼 구현을 검색하기 위해 Get<T> 메서드 호출로 대체됩니다. 종속성 확인 메서드를 Xamarin.Forms에 삽입하는 방법에 대한 자세한 내용은 Xamarin.FormsXamarin.Forms의 종속성 확인을 참조하세요.

다음 코드는 Resolve<T> 메서드를 호출하여 IDeviceOrientationService 인터페이스를 확인한 후 해당 GetOrientation 메서드를 호출하는 예제를 보여 줍니다.

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

또는 이 코드를 다음 한 줄로 요약할 수 있습니다.

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

참고 항목

Resolve<T> 메서드가 Get<T> 메서드 호출로 대체되면 이 메서드는 기본적으로 인터페이스 T의 플랫폼 구현 인스턴스를 싱글톤으로 반환합니다. 그러나 이 동작을 변경할 수 있습니다. 자세한 내용은 확인된 개체의 수명 관리를 참조하세요.

확인된 개체의 수명 관리

DependencyService 클래스의 기본 동작은 플랫폼 구현을 싱글톤으로 확인하는 것입니다. 따라서 플랫폼 구현은 애플리케이션의 수명 동안 유지됩니다.

이 동작은 Get<T>Resolve<T> 메서드에서 DependencyFetchTarget 선택적 인수를 사용하여 지정합니다. DependencyFetchTarget 열거형은 다음 두 개의 멤버를 정의합니다.

  • GlobalInstance - 플랫폼 구현을 싱글톤으로 반환합니다.
  • NewInstance - 플랫폼 구현의 새 인스턴스를 반환합니다. 그런 다음, 애플리케이션이 플랫폼 구현 인스턴스의 수명을 관리해야 합니다.

Get<T>Resolve<T> 메서드는 둘 다 선택적 인수를 DependencyFetchTarget.GlobalInstance로 설정하므로 플랫폼 구현은 항상 싱글톤으로 확인됩니다. 이 동작은 변경될 수 있으므로 DependencyFetchTarget.NewInstanceGet<T>Resolve<T> 메서드에 대한 인수로 지정하면 플랫폼 구현의 새 인스턴스가 생성됩니다.

ITextToSpeechService service = DependencyService.Get<ITextToSpeechService>(DependencyFetchTarget.NewInstance);

이 예제에서 DependencyServiceITextToSpeechService 인터페이스용 플랫폼 구현의 새 인스턴스를 만듭니다. ITextToSpeechService를 확인하는 모든 후속 호출도 새 인스턴스를 만듭니다.

항상 플랫폼 구현의 새 인스턴스를 만들면 결과적으로 애플리케이션이 인스턴스의 수명을 관리합니다. 즉, 플랫폼 구현에 정의된 이벤트를 구독하는 경우 플랫폼 구현이 더 이상 필요하지 않을 때 이벤트에서 구독을 취소해야 합니다. 또한 IDisposable을 구현하고 Dispose 메서드에서 해당 리소스를 정리해야 할 수 있습니다. 애플리케이션 예제는 TextToSpeechService 플랫폼 구현에서 이 시나리오를 보여 줍니다.

애플리케이션은 IDisposable을 구현하는 플랫폼 구현의 사용을 완료할 때 개체의 Dispose 구현을 호출해야 합니다. 이 작업을 수행하는 한 가지 방법은 using 문을 사용하는 것입니다.

ITextToSpeechService service = DependencyService.Get<ITextToSpeechService>(DependencyFetchTarget.NewInstance);
using (service as IDisposable)
{
    await service.SpeakAsync("Hello world");
}

이 예제에서 SpeakAsync 메서드가 호출된 후 using 문은 플랫폼 구현 개체를 자동으로 삭제합니다. 이렇게 하면 필요한 정리를 수행하는 개체의 Dispose 메서드가 호출됩니다.

개체의 Dispose 메서드를 호출하는 방법에 대한 자세한 내용은 IDisposable을 구현하는 개체 사용을 참조하세요.