Bagikan melalui


Xamarin.Forms Pendaftaran dan Resolusi DependencyService

Saat menggunakan Xamarin.FormsDependencyService untuk memanggil fungsionalitas platform asli, implementasi platform harus didaftarkan dengan DependencyService, lalu diselesaikan dari kode bersama untuk memanggilnya.

Mendaftarkan implementasi platform

Implementasi platform harus didaftarkan dengan DependencyService sehingga Xamarin.Forms dapat menemukannya pada runtime.

Pendaftaran dapat dilakukan dengan DependencyAttribute, atau dengan Register metode dan RegisterSingleton .

Penting

Rilis build proyek UWP yang menggunakan kompilasi asli .NET harus mendaftarkan implementasi platform dengan Register metode .

Pendaftaran berdasarkan atribut

DependencyAttribute dapat digunakan untuk mendaftarkan implementasi platform dengan DependencyService. Atribut menunjukkan bahwa jenis yang ditentukan menyediakan implementasi konkret antarmuka.

Contoh berikut menggunakan DependencyAttribute untuk mendaftarkan implementasi iOS antarmuka IDeviceOrientationService :

using Xamarin.Forms;

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

Dalam contoh ini, DependencyAttribute mendaftarkan DeviceOrientationService dengan DependencyService. Ini menghasilkan jenis konkret yang didaftarkan terhadap antarmuka yang diimplementasikannya.

Demikian pula, implementasi IDeviceOrientationService antarmuka pada platform lain harus terdaftar dengan DependencyAttribute.

Catatan

Pendaftaran dengan DependencyAttribute dilakukan pada tingkat namespace layanan.

Pendaftaran menurut metode

Metode DependencyService.Register , dan metode , RegisterSingleton dapat digunakan untuk mendaftarkan implementasi platform dengan DependencyService.

Contoh berikut menggunakan Register metode untuk mendaftarkan implementasi iOS antarmuka IDeviceOrientationService :

[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);
    }
}

Dalam contoh ini, Register metode mendaftarkan jenis beton, DeviceOrientationService, terhadap IDeviceOrientationService antarmuka. Atau, kelebihan metode Register dapat digunakan untuk mendaftarkan implementasi platform dengan DependencyService:

DependencyService.Register<DeviceOrientationService>();

Dalam contoh ini, Register metode mendaftarkan DeviceOrientationService dengan DependencyService. Ini menghasilkan jenis konkret yang didaftarkan terhadap antarmuka yang diimplementasikannya.

Atau, instans objek yang ada dapat didaftarkan sebagai singleton dengan RegisterSingleton metode :

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

Dalam contoh ini, RegisterSingleton metode mendaftarkan DeviceOrientationService instans objek terhadap IDeviceOrientationService antarmuka, sebagai singleton.

Demikian pula, implementasi IDeviceOrientationService antarmuka pada platform lain dapat didaftarkan dengan Register metode , atau RegisterSingleton metode .

Penting

Pendaftaran dengan Register metode dan RegisterSingleton harus dilakukan dalam proyek platform, sebelum fungsionalitas yang disediakan oleh implementasi platform dipanggil dari kode bersama.

Mengatasi implementasi platform

Implementasi platform harus diselesaikan sebelum dipanggil. Ini biasanya dilakukan dalam kode bersama menggunakan DependencyService.Get<T> metode . Namun, itu juga dapat dicapai dengan metode .DependencyService.Resolve<T>

Secara default, DependencyService hanya akan menyelesaikan implementasi platform yang memiliki konstruktor tanpa parameter. Namun, metode resolusi dependensi dapat disuntikkan ke dalam Xamarin.Forms yang menggunakan kontainer injeksi dependensi atau metode pabrik untuk menyelesaikan implementasi platform. Pendekatan ini dapat digunakan untuk menyelesaikan implementasi platform yang memiliki konstruktor dengan parameter. Untuk informasi selengkapnya, lihat Resolusi dependensi di Xamarin.Forms.

Penting

Memanggil implementasi platform yang belum terdaftar dengan DependencyService akan mengakibatkan NullReferenceException dilemparkan.

Mengatasi menggunakan metode Get<T>

Metode ini Get<T> mengambil implementasi platform antarmuka T pada runtime, dan:

  • Membuat instansnya sebagai singleton.
  • Mengembalikan instans yang ada sebagai singleton, yang didaftarkan dengan DependencyService metode RegisterSingleton .

Dalam kedua kasus, instans akan hidup selama masa pakai aplikasi, dan setiap panggilan berikutnya untuk menyelesaikan implementasi platform yang sama akan mengambil instans yang sama.

Kode berikut menunjukkan contoh pemanggilan Get<T> metode untuk menyelesaikan IDeviceOrientationService antarmuka, lalu memanggil metodenya GetOrientation :

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

Atau, kode ini dapat dikondensasikan menjadi satu baris:

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

Catatan

Metode ini Get<T> mengembalikan instans implementasi platform antarmuka T sebagai singleton, secara default. Namun, perilaku ini dapat diubah. Untuk informasi selengkapnya, lihat Mengelola masa pakai objek yang diselesaikan.

Mengatasi menggunakan metode Resolve<T>

Metode ini Resolve<T> mengambil implementasi platform antarmuka T pada runtime, menggunakan metode resolusi dependensi yang telah disuntikkan ke Xamarin.FormsDependencyResolver dalam kelas . Jika metode resolusi dependensi belum disuntikkan ke dalam Xamarin.Forms, Resolve<T> metode akan mundur untuk memanggil Get<T> metode untuk mengambil implementasi platform. Untuk informasi selengkapnya tentang memasukkan metode resolusi dependensi ke dalam Xamarin.Forms, lihat Resolusi dependensi di Xamarin.Forms.

Kode berikut menunjukkan contoh pemanggilan Resolve<T> metode untuk menyelesaikan IDeviceOrientationService antarmuka, lalu memanggil metodenya GetOrientation :

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

Atau, kode ini dapat dikondensasikan menjadi satu baris:

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

Catatan

Resolve<T> Ketika metode kembali memanggil Get<T> metode , metode mengembalikan instans implementasi platform antarmuka T sebagai singleton, secara default. Namun, perilaku ini dapat diubah. Untuk informasi selengkapnya, lihat Mengelola masa pakai objek yang diselesaikan.

Mengelola masa pakai objek yang diselesaikan

Perilaku DependencyService default kelas adalah menyelesaikan implementasi platform sebagai singleton. Oleh karena itu, implementasi platform akan hidup selama masa pakai aplikasi.

Perilaku ini ditentukan dengan DependencyFetchTarget argumen opsional pada Get<T> metode dan Resolve<T> . Enumerasi DependencyFetchTarget mendefinisikan dua anggota:

  • GlobalInstance, yang mengembalikan implementasi platform sebagai singleton.
  • NewInstance, yang mengembalikan instans baru implementasi platform. Aplikasi kemudian bertanggung jawab untuk mengelola masa pakai instans implementasi platform.

Metode Get<T> dan Resolve<T> keduanya mengatur argumen opsional mereka ke DependencyFetchTarget.GlobalInstance, sehingga implementasi platform selalu diselesaikan sebagai singleton. Perilaku ini dapat diubah, sehingga instans baru implementasi platform dibuat, dengan menentukan DependencyFetchTarget.NewInstance sebagai argumen ke Get<T> metode dan Resolve<T> :

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

Dalam contoh ini, DependencyService membuat instans baru implementasi platform untuk ITextToSpeechService antarmuka. Setiap panggilan berikutnya untuk menyelesaikan ITextToSpeechService juga akan membuat instans baru.

Konsekuensi dari selalu membuat instans baru implementasi platform adalah bahwa aplikasi menjadi bertanggung jawab untuk mengelola masa pakai instans. Ini berarti bahwa jika Anda berlangganan peristiwa yang ditentukan dalam implementasi platform, Anda harus berhenti berlangganan dari peristiwa ketika implementasi platform tidak lagi diperlukan. Selain itu, ini berarti bahwa mungkin perlu bagi implementasi platform untuk mengimplementasikan IDisposable, dan membersihkan sumber daya mereka dalam Dispose metode. Aplikasi sampel menunjukkan skenario ini dalam implementasi platformnya TextToSpeechService .

Ketika aplikasi selesai menggunakan implementasi platform yang menerapkan IDisposable, aplikasi harus memanggil implementasi objek Dispose . Salah satu cara untuk mencapai hal ini adalah dengan using pernyataan:

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

Dalam contoh ini, setelah SpeakAsync metode dipanggil, using pernyataan secara otomatis membuang objek implementasi platform. Ini menghasilkan metode objek Dispose yang dipanggil, yang melakukan pembersihan yang diperlukan.

Untuk informasi selengkapnya tentang memanggil metode objek Dispose , lihat Menggunakan objek yang mengimplementasikan IDisposable.