Xamarin.Forms apps need four components to use DependencyService:
Interface – The required functionality is defined by an interface in shared code.
Implementation Per Platform – Classes that implement the interface must be added to each platform project.
Registration – Each implementing class must be registered with DependencyService via a metadata attribute. Registration enables DependencyService to find the implementing class and supply it in place of the interface at run time.
Call to DependencyService – Shared code needs to explicitly call DependencyService to ask for implementations of the interface.
Interface
The interface you design will define how you interact with platform-specific functionality. Be careful if you are developing a component to be shared as a component or NuGet package. API design can make or break a package. The example below specifies a simple interface for speaking text that allows for flexibility in specifying the words to be spoken but leaves the implementation to be customized for each platform:
public interface ITextToSpeech {
void Speak ( string text ); //note that interface members are public by default
}
Implementation per Platform
Once a suitable interface has been designed, that interface must be implemented in the project for each platform that you are targeting. For example, the following class implements the ITextToSpeech interface on iOS:
namespace UsingDependencyService.iOS
{
public class TextToSpeech_iOS : ITextToSpeech
{
public void Speak (string text)
{
var speechSynthesizer = new AVSpeechSynthesizer ();
var speechUtterance = new AVSpeechUtterance (text) {
Rate = AVSpeechUtterance.MaximumSpeechRate/4,
Voice = AVSpeechSynthesisVoice.FromLanguage ("en-US"),
Volume = 0.5f,
PitchMultiplier = 1.0f
};
speechSynthesizer.SpeakUtterance (speechUtterance);
}
}
}
Registration
Each implementation of the interface needs to be registered with DependencyService with a metadata attribute. The following code registers the implementation for iOS:
[assembly: Dependency (typeof (TextToSpeech_iOS))]
namespace UsingDependencyService.iOS
{
...
}
Putting it all together, the platform-specific implementation looks like this:
[assembly: Dependency (typeof (TextToSpeech_iOS))]
namespace UsingDependencyService.iOS
{
public class TextToSpeech_iOS : ITextToSpeech
{
public void Speak (string text)
{
var speechSynthesizer = new AVSpeechSynthesizer ();
var speechUtterance = new AVSpeechUtterance (text) {
Rate = AVSpeechUtterance.MaximumSpeechRate/4,
Voice = AVSpeechSynthesisVoice.FromLanguage ("en-US"),
Volume = 0.5f,
PitchMultiplier = 1.0f
};
speechSynthesizer.SpeakUtterance (speechUtterance);
}
}
}
Call to DependencyService
Once the project has been set up with a common interface and implementations for each platform, use DependencyService to get the right implementation at runtime:
DependencyService.Get().Speak("Hello from Xamarin Forms");
@iFour Techno Lab Pvt Ltd.