DependencyService를 이용한 네이티브 접근

개요

DependencyService는 공유코드에서 플랫폼 고유의 기능을 호출할 수 있도록 해준다. DependencyService는 공유코드에 인터페이스를 정의하고 이것에 대한 실제 구현을 찾아주는 resolver의 역할을 수행함으로써 네이티브 앱이 할수 있는 모든 일은 Xamarin.Forms 앱이 할 수 있도록 해준다.

DependencyService의 작동 원리

DependencyService를 사용하기 위해서는 크게 세가지 컴포넌트가 필요하다.

  • 인터페이스 : 필요한 기능이 공유코드에 인터페이스로 정의된다.
  • 플랫폼 구현체 : 각 플랫폼에 대한 인터페이스의 구현체 클래스.
  • 등록(Registration) : 각 플랫폼 구현체는 메타데이터 속성을 통해 DependencyService에 등록 되어야만 한다. 이 과정은 DependencyService가 구현체를 찾고 런타임에 인터페이스에 해당 구현체를 공급할 수 있도록 해준다.
  • DependencyService 호출 : 공유코드는 인터페이스의 구현체를 찾기위해 명시적으로 DependencyService를 호출할 필요가 있다.

이 과정을 간단히 도식화 하면 아래와 같다.

DependencyService 개념도

인터페이스

인터페이스는 사용하고자 하는 플랫폼 고유의 기능을 정의한다. 만일, 개발하고자 하는 모듈이 다른 프로젝트와 공유될 수 있는 컴포넌트이거나 Nuget 패키지 형태라면 고려되지 않은 네이티브 플랫폼에서 런타임 오류가 발생 할 수 있으므로 주의해야 한다. 아래의 예제코드는 텍스트를 읽어주는 기능에 대한 인터페이스이다. 하지만, 각 플랫폼의 구현체는 별도로 제공하거나 남겨두어야 한다.

1
2
3
public interface ITextToSpeech {
void Speak ( string text ); //note that interface members are public by default
}

플랫폼에서의 구현

인테페이스가 정의되면 프로젝트의 각 플랫폼 프로젝트에서 구현이 수반되어야 한다. 아래 예제코드는 ITextToSpeech 인터페이스에 대한 윈도우폰 플랫폼의 구현에 대한 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
namespace TextToSpeech.WinPhone
{
public class TextToSpeechImplementation : ITextToSpeech
{
public TextToSpeechImplementation() {}
public async void Speak(string text)
{
SpeechSynthesizer synth = new SpeechSynthesizer();
await synth.SpeakTextAsync(text);
}
}
}

모든 네이티브 구현체는 반드시 인자가 없는 생성자를 포함하여야 한다. 이것은, DependencyService가 이 구현체를 인스턴스화 하기 위해 필요하다.

등록

인터페이스에 대한 구현체는 DependencyService가 찾을 수 있도록 메타데이터와 함께 등록되어야 한다. 아래 코드는 윈도우폰을 위한 구현체의 등록 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using TextToSpeech.WinPhone;
[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechImplementation))]
namespace TextToSpeech.WinPhone {
public class TextToSpeechImplementation : ITextToSpeech
{
public TextToSpeechImplementation() {}
public async void Speak(string text)
{
SpeechSynthesizer synth = new SpeechSynthesizer();
await synth.SpeakTextAsync(text);
}
}
}

이 코드에서 등록이 클래스 레벨이 아닌 네임스페이스 레벨에서 이루어지는것에 주의해야 한다.

DependencyService 호출

공통 인터페이스와 플랫폼 고유의 구현체가 DependencyService에 등록되었다면 아래 예제 코드와 같이 호출하여 사용할 수 있다.

1
DependencyService.Get<ITextToSpeech>().Speak("Hello from Xamarin Forms");

예제소스 구조

예제코드는 iOS와 Android 구현체를 포함 하고 있으며 아래 그림과 같이 구성되어 있다.

예제소스 구조

원본출처 : https://developer.xamarin.com/guides/xamarin-forms/dependency-service/introduction/