Erhan Ballıeker

Resilient Network Services Bölüm 7 – Xamarin Projemizde Refit, Polly, Akavache, Fusillade ve ModernHttpClient Birlikte Kullanımı Bölüm 2

Selamlar,

Bir önceki yazımda önhazırlığını tamamladığımız yazımızın asıl kısmına geçelim.  En son IApiRequest adında bir interface oluşuturarak içerisine 3 adet readonly property koymuştuk. Şimdi hızlı bu interface implemente edecek olan gerçek ApiRequest sınıfımızı oluşturalım ve ilgili kütüphaneleri kullanmaya başlayalım.

ApiRequest adında bir class ekleyelim projemize, içeriği aşağıdaki şekilde olacak.

public class ApiRequest : IApiRequest
    {
        private readonly Lazy _background;
        private readonly Lazy _userInitiated;
        private readonly Lazy _speculative;

        public string BaseApiAddress = "https://randomuser.me/api";

        public ApiRequest()
        {
            _background = new Lazy(() => CreateClient(new RateLimitedHttpMessageHandler(new NativeMessageHandler(), Priority.Background), BaseApiAddress));
            _userInitiated = new Lazy(() => CreateClient(new RateLimitedHttpMessageHandler(new NativeMessageHandler(), Priority.UserInitiated), BaseApiAddress));
            _speculative = new Lazy(() => CreateClient(new RateLimitedHttpMessageHandler(new NativeMessageHandler(), Priority.Speculative), BaseApiAddress));
        }

        public T Background => _background.Value;

        public T Speculative => _speculative.Value;

        public T UserInitiated => _userInitiated.Value;

        public T CreateClient(HttpMessageHandler handler, string baseApiAddress = null)
        {
            var client = new HttpClient(handler)
            {
                BaseAddress = new Uri(baseApiAddress ?? BaseApiAddress)
            };

            var res = RestService.For(client);
            return res;
        }
    }

Peki gelelim yukarıda ki class ımızı satır satır inceleyelim. Bu class ımızda bu seri boyunca bahsettiğimiz kütüphanelerden hali hazırda 3 tanesini kullanmış olduk. Bunlar Fusillade, Refit ve ModernHttpClient. Sınıfımız incelersek şunları görüyoruz.

  • class ımız IApiRequest Interfaceinden türüyor, ve buradan alması gereken propertyler aşağıdaki gibi oluşturuldu.
    • public T Background => _background.Value;
    • public T Speculative => _speculative.Value;
    • public T UserInitiated => _userInitiated.Value;
  • Yukarıda bu propertylerin initalize edilme kısmını C# ın Lazy objesine bıraktık. 3 adet field ımızı class ilk başında tanımlandı. Bunların tipi Lazy olarak işaretlendi. Ve ApiRequest sınıfmızın constructor nda da bu Lazy field ların neyi ne şekilde initiazlize edileceklerini tanımladık;
    • 3 Lazy adet field ımız
      • private readonly Lazy _background;
      • private readonly Lazy _userInitiated;
      • private readonly Lazy _speculative;
    • Constructor da bunların yine Lazy sınıfının constructor ını kullanarak ne şekilde ne döneceklerini tanımladık. Aşağıda yazmış olduğumuz CreateClient metodu ile geriye sınıfı oluştururken verdiğimiz generic parametresini geri dönüyoruz.  Constructor da kullandığımız bu RateLimitiedHttpMessageHandler ve NativeMessageHandler a dikkat edelim.YAzmış olduğumuz CreateClient metodu aslında bizim için bir HttpClien oluşturacak bunu biliyoruz. Parametre olarak bu method bizden bir HttpMessageHandler istiyor.  Bu metoda Fusillade in RateLimitedHttpMessageHandler ını veriyoruz ve priority oralark da her bir interface imizden gelen her bir property karşılık olan Fusillade Priortiy lerini veriyoruz.  RateLimitedHttpMessageHandler  içerisine contructor parametresi olarak bir de ModernHttpClient ın  NativeMessageHandler ını veriyoruz. Bu sayede en alttaki CreateClient metodumuza geçmiş olduğumuz HttpMessageHandler, ModerHttpclient ın handler ını kullanan Fusillade in RateLimited handler ı olmuş oldu. Bu ikisini bir arada bu şekilde kullanabiliriz.
      • _background = new Lazy(() => CreateClient(new RateLimitedHttpMessageHandler(new NativeMessageHandler(), Priority.Background), BaseApiAddress));
      • _userInitiated = new Lazy(() => CreateClient(new RateLimitedHttpMessageHandler(new NativeMessageHandler(), Priority.UserInitiated), BaseApiAddress));
      • _speculative = new Lazy(() => CreateClient(new RateLimitedHttpMessageHandler(new NativeMessageHandler(), Priority.Speculative), BaseApiAddress));
    • Interface den gelen Propertylerimiz class ımız üzerinden seçildiğinde, LAzy sınıfı bizim ona verdiğimiz delegate i kullanarak bu sınıfı oluştururken verdiğimiz generic T objesini bizim için oluşturacak.
  • CreatClient metoduna bakalım.
    • var client = new HttpClient(handler)
    • { BaseAddress = new Uri(baseApiAddress ?? BaseApiAddress) };
      • Burada yeni HttpClient objesi oluşturup bunun runtime da bizim istediğimiz yaşayan Refit interface ini alıp haberleşme yapısı olarak geri vermesi için Refit in RestService.For generic metodu nu kullanıp içeriye client ımızı veriyoruz.
    • var res = RestService.For(client); return res;

Peki hemen bir de madem Refit i de kullandık, ilk yazıda belirttiğim bu endpoint ile haberleşecek ve userları bize getirecek olan refit Interface imizi oluşturalım.

Ben genelde bu refit interfacelerini proje içerisinde Endpoints diye bir klasör altında toplarım. Burada da öyle yapalım Endpoints diye bir klasör açalım ve içerisine

IRandomUserEndpoint diye bir interface ekleyelim

    [Headers("Content-Type : application/json")]
    public interface IRandomUserEndpoint
    {
        [Get("/")]
        Task GetUserList(int results, int page);
    }

Interfaceimizin içeriği yukarıdaki gibi olacak. Refit ile ilgili postlarımda refit kullanarak e şekilde requestleri nasıl metod haline dönüştürdüğümüzün detaylarına girmiştim. Burada özetle;

  • her bir request e “Content-Type : application/json” header ı ekliyoruz.
  • Get metodu ile direk olarak verilen base url gittiğimizi Get metodunu kullanarak söylüyoruz.
  • results ve page parametreleri de url de karşılıkları olmadığı için otomatik olarak querystring olarak request url ine eklenecekler.

Bu şekilde bahsettiğmiz url ile haberleşecek interface ide oluşturmuş olduk. gerisi refit e kalıyor.

Tüm bu yazdıklarımızdan sonra bir özetlemek istersek ne şekilde bunları kullanabiliriz ve neler olmuş olur şöyle bir üzerinden geçelim.

Uygulamada şu kodu yazdığımız anda;

IApiRequest<IRandomUserEndpoint>.UserInitiated

dediğimiz de Refit bizim için yazdığımız interface in yaşayan bir httpclient halini üretecek. Bu HttpClient a verdiğimiz Fusillade nin RateLimitedHttpMessageHandler ve ModernHttpClient ın NativeMessageHandler  ları refit oluşturacağı HttpClient ın HttpMessageHandler ları olarak kullanılacak. Yani Refit e oluşturmasını istediğimiz HttpClient nasıl bir haberleşme yağacağını söylüyoruz, bu esnada hangi handlerları kullanmasını istediğimizi söylüyoruz ve sonrasında ortaya Refit, Fusillade ve ModernHttpClient ın bir arada kullanılmış olduğu güzel bir client objesi elimze geçiyor. Ve bunun üzerinden kullanımımıza devam ediyoruz.

Bu post u burada bırakıyorum. Bir sonraki post umda bu serinin son yazısını yani kullanıma Polly e Akavache yi de nasıl dahil edeceğimize bakarak, tamamlamış olmayı umut ediyorum 🙂

Bir sonraki yazımda görüşmek üzere.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

%d blogcu bunu beğendi: