Aracılığıyla paylaş


Xamarin.Forms DependencyService Kaydı ve Çözümü

yerel platform işlevselliğini çağırmak için kullanılırken Xamarin.FormsDependencyService , platform uygulamalarının DependencyServiceöğesine kaydedilmesi ve sonra bunları çağırmak için paylaşılan koddan çözümlenmesi gerekir.

Platform uygulamalarını kaydetme

Platform uygulamalarının çalışma zamanında bulunabilmesi Xamarin.Forms için ile DependencyService kaydedilmesi gerekir.

Kayıt, ile DependencyAttributeveya ve RegisterSingleton yöntemleriyle Register gerçekleştirilebilir.

Önemli

.NET yerel derlemesi kullanan UWP projelerinin yayın derlemeleri, platform uygulamalarını yöntemlerle Register kaydetmelidir.

Özniteliğe göre kayıt

ile DependencyAttribute bir platform uygulaması DependencyServicekaydetmek için kullanılabilir. özniteliği, belirtilen türün arabirimin somut bir uygulamasını sağladığını gösterir.

Aşağıdaki örnek DependencyAttribute , arabiriminin iOS uygulamasını IDeviceOrientationService kaydetmek için kullanır:

using Xamarin.Forms;

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

Bu örnekte, DependencyAttribute ile kaydeder DeviceOrientationServiceDependencyService. Bu, somut türün uyguladığı arabirime göre kaydedilmesine neden olur.

Benzer şekilde, arabiriminin IDeviceOrientationService diğer platformlardaki uygulamaları ile DependencyAttributekaydedilmelidir.

Not

ile DependencyAttribute kayıt, ad alanı düzeyinde gerçekleştirilir.

Yönteme göre kayıt

DependencyService.Register yöntemleri ve RegisterSingleton yöntemi ile bir platform uygulamasını DependencyServicekaydetmek için kullanılabilir.

Aşağıdaki örnek, arabiriminin Register iOS uygulamasını IDeviceOrientationService kaydetmek için yöntemini kullanır:

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

Bu örnekte yöntemi, Register arabirimine karşı IDeviceOrientationService somut türünü DeviceOrientationServicekaydeder. Alternatif olarak, bir platform uygulamasını ile kaydetmek için yönteminin RegisterDependencyServiceaşırı yüklemesi kullanılabilir:

DependencyService.Register<DeviceOrientationService>();

Bu örnekte yöntemi ile Register kaydeder DeviceOrientationServiceDependencyService. Bu, somut türün uyguladığı arabirime göre kaydedilmesine neden olur.

Alternatif olarak, mevcut bir nesne örneği yöntemiyle RegisterSingleton tekil olarak kaydedilebilir:

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

Bu örnekte yöntemi, RegisterSingleton nesne örneğini DeviceOrientationService tekil olarak arabirime IDeviceOrientationService kaydeder.

Benzer şekilde, arabirimin IDeviceOrientationService diğer platformlardaki uygulamaları yöntemlere veya yöntemine RegisterRegisterSingleton kaydedilebilir.

Önemli

Platform uygulaması tarafından sağlanan işlevler paylaşılan koddan çağrılmadan önce platform projelerinde ve RegisterSingleton yöntemleriyle Register kayıt gerçekleştirilmelidir.

Platform uygulamalarını çözme

Platform uygulamaları çağrılmadan önce çözümlenmelidir. Bu genellikle yöntemi kullanılarak paylaşılan kodda DependencyService.Get<T> gerçekleştirilir. Ancak, yöntemiyle DependencyService.Resolve<T> de gerçekleştirilebilir.

Varsayılan olarak, DependencyService yalnızca parametresiz oluşturucuları olan platform uygulamalarını çözümler. Ancak, platform uygulamalarını çözümlemek için bağımlılık ekleme kapsayıcısı veya fabrika yöntemleri kullanan bir bağımlılık çözümleme yöntemi Xamarin.Forms eklenebilir. Bu yaklaşım, parametreleri olan oluşturucuları olan platform uygulamalarını çözümlemek için kullanılabilir. Daha fazla bilgi için bkz . içindeki Xamarin.Formsbağımlılık çözümlemesi.

Önemli

ile kaydedilmemiş bir platform uygulamasını çağırmak DependencyService , bir NullReferenceException atılmasıyla sonuçlanır.

Get<T> yöntemini kullanarak çözümle

yöntemi, Get<T> çalışma zamanında arabirimin T platform uygulamasını alır ve aşağıdakilerden birini alır:

  • Tekil olarak bir örneğini oluşturur.
  • yöntemi tarafından RegisterSingleton ile DependencyService kaydedilen bir tekil olarak var olan bir örneği döndürür.

Her iki durumda da örnek uygulamanın ömrü boyunca yaşar ve aynı platform uygulamasını çözümlemek için yapılan sonraki çağrılar aynı örneği alır.

Aşağıdaki kod, arabirimi çözümlemek IDeviceOrientationService için yöntemini çağırma Get<T> ve ardından yöntemini çağırma örneğini GetOrientation gösterir:

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

Alternatif olarak, bu kod tek bir satırda değiştirilebilir:

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

Not

yöntemi, Get<T> varsayılan olarak arabirimin T platform uygulamasının bir örneğini tekil olarak döndürür. Ancak, bu davranış değiştirilebilir. Daha fazla bilgi için bkz . Çözümlenen nesnelerin ömrünü yönetme.

Çözümle T> yöntemini kullanarak çözme<

Resolve<T> yöntemi, sınıfına DependencyResolver eklenmiş Xamarin.Forms bir bağımlılık çözümleme yöntemi kullanarak çalışma zamanında arabiriminin T platform uygulamasını alır. içine bir bağımlılık çözümleme yöntemi eklenmemişse Xamarin.FormsResolve<T> yöntemi, platform uygulamasını almak için yöntemini çağırmaya Get<T> geri dönüş yapacaktır. içine bağımlılık çözümleme yöntemi Xamarin.Formsekleme hakkında daha fazla bilgi için bkz . içindeki Xamarin.Formsbağımlılık çözümlemesi.

Aşağıdaki kod, arabirimi çözümlemek IDeviceOrientationService için yöntemini çağırma Resolve<T> ve ardından yöntemini çağırma örneğini GetOrientation gösterir:

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

Alternatif olarak, bu kod tek bir satırda değiştirilebilir:

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

Not

Resolve<T> yöntemi, yöntemini çağırmaya Get<T> geri döndüğünde, varsayılan olarak arabirimin T platform uygulamasının bir örneğini tekil olarak döndürür. Ancak, bu davranış değiştirilebilir. Daha fazla bilgi için bkz . Çözümlenen nesnelerin ömrünü yönetme.

Çözümlenen nesnelerin yaşam ömrünü yönetme

sınıfının varsayılan davranışı DependencyService , platform uygulamalarını tekil olarak çözümlemektir. Bu nedenle, platform uygulamaları bir uygulamanın ömrü boyunca yaşayacaktır.

Bu davranış ve Resolve<T> yöntemlerindeki DependencyFetchTargetGet<T> isteğe bağlı bağımsız değişkenle belirtilir. Numaralandırma DependencyFetchTarget iki üye tanımlar:

  • GlobalInstance, platform uygulamasını tekil olarak döndürür.
  • NewInstance, platform uygulamasının yeni bir örneğini döndürür. Uygulama daha sonra platform uygulama örneğinin kullanım ömrünü yönetmekle sorumludur.

Get<T> ve Resolve<T> yöntemleri isteğe bağlı bağımsız değişkenlerini DependencyFetchTarget.GlobalInstanceolarak ayarlar ve bu nedenle platform uygulamaları her zaman tekil olarak çözümlenir. Bu davranış değiştirilebilir, böylece ve Resolve<T> yöntemleri için bağımsız değişkenler olarak belirterek DependencyFetchTarget.NewInstance platform uygulamalarının Get<T> yeni örnekleri oluşturulabilir:

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

Bu örnekte, DependencyService arabirimi için platform uygulamasının yeni bir örneğini ITextToSpeechService oluşturur. çözümlenecek ITextToSpeechService sonraki çağrılar da yeni örnekler oluşturur.

Platform uygulamasının her zaman yeni bir örneğini oluşturmanın sonucu, uygulamanın örneklerin ömrünü yönetmekle sorumlu hale gelmesidir. Başka bir deyişle, platform uygulamasında tanımlanan bir olaya abone olursanız, platform uygulaması artık gerekli olmadığında olay aboneliğini kaldırmanız gerekir. Buna ek olarak, platform uygulamalarının IDisposableuygulamasının ve kaynaklarını yöntemlerle Dispose temizlemenin gerekli olabileceği anlamına gelir. Örnek uygulama, bu senaryoyu TextToSpeechService platform uygulamalarında gösterir.

Bir uygulama, uygulamasını uygulayan IDisposablebir platform uygulamasını kullanmayı bitirdiğinde nesnenin Dispose uygulamasını çağırmalıdır. Bunu gerçekleştirmenin bir yolu bir using deyimidir:

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

Bu örnekte, yöntemi çağrıldıktan using sonra SpeakAsync deyimi platform uygulama nesnesini otomatik olarak atar. Bu, nesnenin Dispose yönteminin çağrılarak gerekli temizlemeyi gerçekleştirmesine neden olur.

Bir nesnenin Dispose yöntemini çağırma hakkında daha fazla bilgi için bkz . IDisposable uygulayan nesneleri kullanma.