Fırat Esmer

Microsoft Yazılım Teknolojileri

Hangfire Hakkında

Bugünün konusu olarak belki duyduğunuz, belki de çoktan büyük ölçekli uygulamalarınızda kullandığınız Hangfire kütüphanesinden bahsedeceğim. Hadi başlayalım. (Github)

Hangfire Nedir?

Background job'ları (arka plan işleri) yaratmanıza, yürütmenize ve yönetmenize kolaylık sağlayan açık kaynaklı kütüphanedir. Job storage olarak bir çok veritabanı (SQL Server, SQL Server + MSMQ, Redis ve daha fazlası), IoC Container ve Unit Test desteklemektedir. Listesi için Hangfire Extension sayfasına göz atabilirsiniz. Hangfire Sidekiq, Resque ve Celery uygulamalarına .NET alternatifidir. 

Background Job Nedir?

Bazı kodların arka planda çalışması gerekmektedir. Çünkü bir iş parçacığının ana thread'de çalışması hem doğası gereği hem de bazı ihtiyaçlar dahilinde uygun olmayabiliyor.

Hangfire Kullanımının Artıları

  • Kullanımı kolay, bir kaç satırla tüm .NET uygulamalarınızda çalıştırabilirsiniz,
  • Yönetilebilirlik ve görünebilirlik sağlar,
  • İşler veritabanında tutulduğu için güvenilirdir. İş tamamlanmadıkça tamamlandı durumuna geçmez, kod bloğunun bitimine kadar çıkacak herhangi bir sorunda iş tekrar çalışacaktır,
  • Uygulamanızdan farklı, dağıtık şekilde kullanılabilir (Infrastructure),
  • ASP.NET uygulamalarında yaşanan sorunlara çözüm sağlar
    • Uzun süren request thread'ler,
    • Birden fazla yaratılmış background job instance'ı (aynı işin aynı zamanda yapılabiliyor olması sorunu),
    • IIS'in AppDomain ve App Pool recycle etmesi (Background job'ların yarım kalması ve tekrarlanmaması).

Hangfire'ın Desteklediği Background Job Tipleri

  • Fire and forget : Bir kere ve hemen çalışan background job tipi
var jobId = BackgroundJob.Enqueue(
    () => Console.WriteLine("Fire-and-forget!"));
  • Delayed : Bir kere fakat belirtilen sürenin sonunda çalışan background job tipi
var jobId = BackgroundJob.Schedule(
    () => Console.WriteLine("Delayed!"),
    TimeSpan.FromDays(7));
  • Recurring : Çok kez ve belirtilmiş CRON sürecinde (günlük, saatlik, haftalık veya CRON expressions vb.) çalışan background job tipi
RecurringJob.AddOrUpdate(
    () => Console.WriteLine("Recurring!"),
    Cron.Daily);
  • Continuations : Tanımlanan ana işin bitiminde çalışan background job tipi
BackgroundJob.ContinueWith(
    jobId,
    () => Console.WriteLine("Continuation!"));
  • Batch (PRO) : Birden fazla işin grup halinde çalışan background job tipi
var batchId = BatchJob.StartNew(x =>
{
    x.Enqueue(() => Console.WriteLine("Job 1"));
    x.Enqueue(() => Console.WriteLine("Job 2"));
});
  • Batch Continuations (PRO) : Grup halinde çalışan ana background job'ın bitimiyle çalışan background job tipi
BatchJob.ContinueWith(batchId, x =>
{
    x.Enqueue(() => Console.WriteLine("Last Job"));
});

NOT : PRO olarak ifade edilen background job tipleri Hangfire'ın ücretsiz sürümünde yer almamaktadır. Yıllık ücret karşılığında bu background job'lara erişilebilir. Ücretlendirme ile ilgili bilgilere ulaşmak için Hangfire Pricing ekranına göz atabilirsiniz. (Ek olarak : Compleks iş akışları, Redis depolama desteği, performance counter işlemleri)

Hangfire Architecture

Hangfire Kurulum ve Konfigürasyon

Hangfire'ı kullanmak istediğiniz projenize Nuget Package Manager yoluyla veya komutla Hangfire'ı yükleyin.

Hangfire NuGet Package

Komut : PM> Install-Package Hangfire (Nuget)

NOT : Farklı proje tipleri için farklı paketler yüklemeniz gerekebilir. Örneğin console uygulaması için Hangfire.Core yüklemeniz lazım fakat IIS'de host edilen web uygulaması için Owin de yüklenmelidir (dependency => Hangfire). Yükleme ve paket ile ilgili bilgiler için Hangfire Installation sayfasına göz atabilirsiniz.

Aşağıda paylaştığım konfigürasyon örneği (en basit haliyle), ASP.NET MVC projesidir.

using Owin;
using Microsoft.Owin;
using Hangfire;
using HangfireDemo;

[assembly: OwinStartup(typeof(Startup))]
namespace HangfireDemo
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Hangfire sunucu bağlantı
            GlobalConfiguration.Configuration.
                UseSqlServerStorage(@"Server=.\SQLExpress;Database=HangfireDemo;Trusted_Connection=True;");

            // Hangfire dashboard kullan
            app.UseHangfireDashboard();

            // Hangfire sunucu kullan
            app.UseHangfireServer();
        }
    }
}

NOT : Batch kullanmak istiyorsanız ekstradan "GlobalConfiguration.Configuration.UseBatches()" satırını eklemeniz gerekiyor.

Hangfire yaratılan job'ları veritabanında tutar, tamamlandıkça da kendisi siler. Veritabanını kendisi yaratmıyor fakat gerekli tabloları kendisi oluşturuyor. (Uygulamanızın veritabanı ile Hangfire veritabanı farklı olabilir.)

Uygulamayı çalıştırdığınızda tabloların oluştuğunu göreceksiniz.

Hangfire veritabanı tabloları

Hangfire dashboard'a ulaşmak için uygulamanızın URL'inin sonuna "/hangfire" yazmanız yeterli.

Hangfire Dashboard

Hangfire Entegrasyonu

Hangfire'ı uygulamanızda kullanırken uygulayabileceğiniz bir kaç farklı senaryo var.

  • Single Process
    Hangfire Single Process
  • Web Garden
    Hangfire Web Garden
  • Web Farm
    Hangfire Web Farm
  • Separate Service
    Hangfire Separate Service
  • Separate Server
    Hangfire Separate Server

Hangfire Parametre İşlemleri

  • Çoklu parametre desteği var,
  • Parametreler serialise (JSON) edilip veritabanında tutuluyor (Array, collection, custom object),
  • Referans parametre ve ref ve out keyword'leri için desteği bulunmamaktadır,
  • Tüm kayıt yerine Id gibi belirgin değerin tutulması tavsiye edilir. Sebebi ise job storage'da tutulacak kaydın boyutu daha küçük olması.

Hangfire Dashboard

Host İşlemi

  • OWIN Middleware olarak yazılmıştır
    • ASP.NET, Nancy ve ServiceStack
  • OWIN Self Host
    • Console uygulaması ve Windows Service
  • Gereklilikler
    • Microsoft.Owin.Host.SystemWeb
    • OWIN Startup class
    • app.UseHangfireDashboard() konfigürasyon kodu

Sunduğu Özellikler

  • Servers (sunucular) : Kullanılan Hangfire sunucuları ve bilgilerini (name, workers, queues, başladığı an ve en son çalıştığı an vs.) gösterir
  • Recurring Jobs : Yaratılan recurring job bilgilerini gösterir. Bunlar : Cron, Time Zone, Job, ne zaman çalışacağı, en son ne zaman çalıştığı ve yaratıldığı tarih. Ayrıca, her ne kadar belirli bir tarih tanımlanmış olsa da Trigger özelliği ile istenilen an tetiklenebilir.
  • Retries (tekrar) : Yaratılan job'ların hata alması durumunda job'ların gösterildiği ekrandır. Kaç kere denendiği de görülebilir. Default olarak atanmış deneme (retry) sayısı 10'dur.
  • Jobs (işler)
    • Enqueued : Sırada olan işler,
    • Scheduled : İleri tarihe ayarlanmış işler,
    • Processing : Çalışan işler,
    • Succeeded : Başarılı şekilde tamamlanmış işler,
    • Failed : Başarısız olmuş işler (tanınmış atama sayısından sonra bile hata alınıyorsa iş buraya düşer),
    • Deleted : Silinmiş işler,
    • Awaiting : Sırasını bekleyen (continuations) işler.

Hangfire Dashboard Gelişmiş Konfigürasyon Seçenekleri

Hangfire Dashboard URL değişikliği ve geri yönlendirme opsiyonu

            // Dashboard üzerinden "back to site" button
            var options = new DashboardOptions { AppPath = VirtualPathUtility.ToAbsolute("/Home/Index") };
            // Dashboard custom URL
            app.UseHangfireDashboard("/ApplicationHangfireDashboard", options);

Birden fazla Hangfire Dashboard (ve/veya farklı veritabanları) kullanımı

            var storage1 = new SqlServerStorage("HangfireDatabase1");
            var storage2 = new SqlServerStorage("HangfireDatabase2");

            app.UseHangfireDashboard("/Hangfire1", new DashboardOptions(), storage1);
            app.UseHangfireDashboard("/Hangfire2", new DashboardOptions(), storage2);

            // Hangfire sunucu kullan
            // app.UseHangfireServer();

Hangfire Dashboard Güvenlik

Hangfire Dashboard'a default; local olarak erişilebilir. Örneğin sunucuda IIS'de çalışan bir web uygulamanızın Hangfire Dashboard'una remote (uzaktan erişim) makineden erişemezsiniz. Fakat uzaktan erişim için yetki vermeniz mümkün. Bunun için (IAuthorizationFilter 2.0.0 ile silinecek) IDashboardAuthorizationFilter interface'ini kullanmanız gerekiyor.

        public void Configuration(IAppBuilder app)
        {
            GlobalConfiguration.Configuration.
                UseSqlServerStorage(@"Server=.\SQLExpress;Database=HangfireDemo;Trusted_Connection=True;");

            app.UseHangfireDashboard("/hangfire", new DashboardOptions()
            {
                Authorization = new[] { new HangfireAuthorizationFilter() }
            });

            // Methodları çağırma sırası önemlidir
            // Önce authentication sonra 
            // HangFireServer
            app.UseHangfireServer();
        }

        public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
        {
            public bool Authorize(DashboardContext context)
            {
                if (HttpContext.Current.User.IsInRole("RoleName"))
                    return true;

                return false;
            }
        }

Daha fazla bilgi için => http://docs.hangfire.io/en/latest/configuration/using-dashboard.html#configuring-authorization

Hangfire Exception

Hangfire, uygulamanızda alacağınız hataları (default tekrar deneme sayısı : 10) hata detayı ile birlikte gösterir. Hata aldığınız job, retries sekmesine düşer. Retry sayısını Global ve Method seviyesinde değiştirmek mümkün. Örneğin retry sayısını 1 yaparsanız 1. denemeden sonra tekrar hata alınması durumunda job Failed sekmesine düşecektir.
Global seviyede retry sayısını değiştirmek için aşağıdaki kodu kullanabilirsiniz.

GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute() {  Attempts = 1});

Method seviyesinde değiştirmek isterseniz, methodunuza aşağıdaki attribute'u ekleyebilirsiniz.

[AutomaticRetry(Attempts = 1)]

Eğer fail olan joblarınızın manuel değil de otomatik olarak silinmesini istiyorsanız
AutomaticRetry(OnAttemptsExceeded = AttemptsExceededAction.Delete) kodunu kullanabilirsiniz.
Daha fazla bilgi için => http://docs.hangfire.io/en/latest/background-processing/dealing-with-exceptions.html

HangFire Logging

Hangfire otomatik loglama desteğine (Serilog, NLog, Log4Net, EntLib Logging, Loupe ve Elmah) sahiptir. Otomatik loglama; startup sınıfında log provider tanımlamanızın yettiği anlamına geliyor. Ayrıca custom loglama desteği (ILogProvider, ILog) de mevcuttur.
Daha fazla bilgi için => http://docs.hangfire.io/en/latest/configuration/configuring-logging.html

HangFire SQL Server Ayarları

            var serverOptions = new SqlServerStorageOptions
            {
                // Hangfire'ın ne kadar süre aralıkta kontrol edeceği bilgisi
                // Default değeri 15 saniye
                QueuePollInterval = TimeSpan.FromSeconds(45),
                // Veritabanında tabloların yaratılıp yaratılmayacağı bilgisi
                // Manuel migration işlemleri için false yapılabilir
                // Default değeri true
                PrepareSchemaIfNecessary = false
            };

            GlobalConfiguration.Configuration.UseSqlServerStorage("Veritabanı", serverOptions);

Daha fazla bilgi için => http://docs.hangfire.io/en/latest/configuration/using-sql-server.html

NOT : Hangfire, Redis desteklemektedir. Redis'in tercih sebepleri arasında yüksek performans (in-memory) ilk sıradadır fakat Redis kullanmak için Hangfire PRO yani ücretli versiyonu kullanılması zorunludur. Daha fazla bilgi için => http://docs.hangfire.io/en/latest/configuration/using-redis.html

Hangfire Performance Comparison

Ve son olarak dikkat edilmesi gerekenler...

  • Job'ları kullandığınız metotlar yarıda kesilebilir ve tekrarlanabilir,
  • Methodlarda kullandığınız parametreler, kompleks olmayan (basit), küçük ve object yerine primitif tip,
  • Unit test ve IoC'ye uygun,
  • Job takibi Polling vs. Pushing (örnek : SignalR) ayrımı gözetilerek

yazılırsa kodunuz optimize olmuş olur.

Windows 10 Creators Update - 2017

Windows 10

Az biraz Windows platformu için uygulama yazıyorsanız Redstone adını duymuşsunuzdur. Redstone, Microsoft'un Windows 10 için yapılacak büyük güncellemelerine verdiği kod adı. Redstone 1, hepinizin de muhtemelen şu an kullandığı Windows 10 Anniversary Update veya diğer şekilde ifade edelim Windows 10 versiyon 1607 (10.0.14393) oluyor.

Nisan 2017 gibi gelecek olan Redstone 2 (Windows 10 Creators Update veya Windows 10 versiyon 1704) için dün Microsoft bir etkinlik düzenledi. Gelelim bu etkinlikte biz yazılımcıları neler bekliyor, ucundan bakalım.

Başlamadan önce; oturumları izlemek istiyorum derseniz buraya, Microsoft tarafından etkinliğe dair paylaşımı okumak istiyorum derseniz de buraya tıklayabilirsiniz.

  • Universal Windows Platform

Microsoft'un akıllı telefon piyasasına geç girmesi ve Windows 8 sonrası işletim sistemlerinde yaşadığı uygulama ekosistemi faciası hala devam ediyor. Piyasada bırakın amiral gemisini artık telefonu bile bulunmuyor. Hatta Nokia Android işletim sistemi tabanlı telefonları duyurduğu vakit 250.000'e yakın sipariş aldığını açıkladı. Bunun sebebi Windows'un mobil pazarda tek haneli paya sahip olması. Aslında bu kadar düşük pazar payına sahip olmasının diğer bir sebebi de telefon bulunmaması. Telefon olsa satmıyor çünkü uygulama yok derken böyle bir döngüye sokuyor insanı Microsoft. Xamarin olsun, Desktop Bridge (masaüstü uygulamarını UWP'ye çevirmek) olsun Microsoft'un kan kaybı durulmuyor. ÇÜNKÜ! UWP başlı başına hala geliştiriciler için uygun bir ortam değil. Öncelikle cezbetmiyor. Cezbetmesi için güzel görünüyor olması lazım, değil mi? Günümüzde işler öyle yürümüyor mu? (Evet) Son zamanlarda tanıtılan yeni Surface ürünleri de bunun bir göstergesi. Zaten Surface ailesinden geriye sadece Surface Phone kaldı, onu da göreceğiz. O yüzden Microsoft, bu etkinliği en çok UWP ve görselliğe ayırdı (Composition & XAML). Bunun yanı sıra ekstra componentler de tanıtıldı.

Adobe, Windows 10 ile tanıtılan Ink için ve core uygulamaları için componentler yayınlayacağını söyledi,
Facebook, Universal Windows Platform uygulamaları için Facebook App Install Ads desteği yayınlıyor,
Telerik, Universal Windows Platform uygulamaları için 20'den fazla kontrolü (Telerik UI for UWP) ücretsiz hale getirdi ve açık kaynak koda geçtiğini duyurdu. Kontroller hakkında bilgi almak için buraya (resmi paylaşımı için buraya), GitHub üzerinden indirmek için buraya, NuGet üzerinden indirmek içinse buraya tıklayabilirsiniz.

Visual Studio 2017 XAML için "Edit and Continue" seçeneği ile UI'da yapılacak değişiklikler direkt olarak uygulamamıza yansıyacak. Ek olarak performans artışı ve stabilite sağlanacak. UWP için kod yazdıysanız design ekranlarının ne kadar yavaş yüklendiğini ve sık sık hata verdiğini görmüşsünüzdür. Burası biraz daha detaylı fakat kısa geçiyorum.

Ekstra not olarak düşeyim, mağazaya uygulamayı gönderme işlemleri, "Dev Center" gibi konularda da yenilikler mevcut.

NOTLAR

  1. Visual Studio 2017, Mart'ın 7'sinde yayınlanıyor (RTM) daha fazla bilgi için buraya tıklayabilirsiniz,
  2. Microsoft, tüm dokümanlarını yeni site altında toplama işlemine kaldığı yerden devam ediyor. UWP de eklendi. Buradan inceleyebilirsiniz,
  3. Universal Windows Platform için yol haritası (roadmap) ve Windows platformu için bug takip listesi yayınladı. Buradan inceleyebilirsiniz (iki kısma da aynı sayfadan erişilebiliyor),
  4. Son zamanlarda Project Neon adı altında Windows'un yenilenmiş ve şeffaflandırılmış arayüz görselleri paylaşılıyordu. Etkinlikte göstere göstere gözümüze soktular. Bu da sanırım 2017 sonlarına doğru yayınlanacak olan Redstone 3 güncellemesi ile yayınlanacak. Aşağıda henüz konsept olan görseli inceleyebilirsiniz.
    Project Neon
  • Windows SDK for Google Analytics

Universal Windows Platform (UWP) uygulamaları, .NET Windows uygulamaları ve Xamarin uygulamaları tarafından kullanılabilecek bu SDK (Google Universal Analytics) ile kullanıcılar gerçek zamanlı verilere ulaşabilecek. Windows Developer blogunda yayınlanan paylaşıma buradan, Github üzerinden SDK'ya erişmek için buraya tıklayabilirsiniz.

BONUS

  • Önceki yazımda Samsung'un işletim sistemi Tizen için .NET uygulamaları yazılabileceğini ve ilk önizleme versiyonunu yayınladığını açıklamıştım. Önizleme versiyonunun ikincisi de geçen günlerde yayınlandı. İncelemek isterseniz buraya tıklayın,
  • Windows 10 Anniversary Update ile yayınlanan Project Rome için SDK yayınlandı. GitHub üzerinden erişebilirsiniz.

Microsoft Connect(); // 2016

Connect(); //2016

Microsoft'un 16-17 Kasım tarihlerinde düzenlediği Connect etkinliğinde hepimizi yakından ilgilendirecek gelişmeler açıklandı. Sadece Microsoft teknolojileri ile ilgili olmadığını vurgulamak istiyorum.

Etkinlikte çok sayıda gelişmeden bahsedildi fakat ben size bazı önemli olan açıklamaları yazacağım. Merak ediyorsanız tüm gelişmelere buradan ulaşabilirsiniz, 120'den fazla oturum var.

Mac için Visual Studio (Preview)

Microsoft'un açık kaynak koda yüzünü çevirmesi ile yaşanan gelişmelerin haddi hesabı yok. Linux tarafında yaşanan gelişmeler her ne kadar daha heyecanlandırıcı olsa da (benim için) Mac için de güzel gelişmeler var. Bunlardan birisi Visual Studio'nun Mac'te çalışacak olması. Her ne kadar tüm VS proje tiplerini desteklemese de native iOS, Android ve Mac geliştirme yapılabiliyor (teşekkürler Xamarin). İsmi Visual Studio olsa da aslında IDE Xamarin Studio tabanlı fakat UX Visual Studio'ya ait.

C# ve F# desteği mevcut. IntelliSense ve refactor ise Roslyn Compiler tabanlı. Ayrıca Xamarin ve .NET Core uygulamarı, Xamarin.iOS ve Xamarin.Android'de kullanılan debug motoru burada da var.

Daha fazla bilgi ve indirmek için buraya, etkinlik oturumunu izlemek için ise buraya tıklayabilirsiniz.

Visual Studio 2017 (RC)

Visual Studio 2017 yeniliklerinden bahsetmektense direkt olarak kaynak linki vereyim ve siz bakın. Çünkü Microsoft, Visual Studio 2017 için detaylı açıklamalarla ve resimlerle dolu bir sayfa hazırlamış. Buyrun, yeniliklere göz atmak veya indirmek isterseniz buraya, etkinlik oturumunu izlemek istiyorsanız buraya tıklayabilirsiniz. Ayrıca Visual Studio Team Foundation Server 2017 RTM de duyuruldu, yenilikler için buraya tıklayabilirsiniz.

Microsoft Linux Vakfı'na Platinum Üye olarak katıldı

Dediğim gibi, yeni bir Microsoft vizyonu hepimize iyi gelecek. Şimdiden hızlı gelişmelere şait oluyoruz. (Bu arada Platinum üyeler her sene 500.000$ bağış yapmalıymış. #HerGünGereksizBirBilgi)

Google ve Samsung .NET Vakfı'na katıldı

Samsung'u anlarım da Google'ın bunca zaman kötülüğünden sonra açıkçası biraz şaşırdım. Gözümde Evil Co. olarak mimlenmiş (bir diğeri de eski Microsoft), Windows Phone camiasına hiç uygulama yazmayan, yazanlara da karşı çıkan (Microsoft'un yaptığı uygulamalar kaldırılmıştı), API desteğini kısıtlayan bir şirketten bahsediyoruz. Neyse, sonuçta güzel bir hamle. Biz insanlar birlikten kuvvet doğduğunu biliyoruz ama firmalar kendi ürünlerine talebi artırmak adına bundan uzak duruyordu, yola geliyorlar. Gelecekler.

Samsung'un açık kaynak kod işletim sistemi Tizen'i duydunuz mu bilmiyorum fakat .NET desteğini duyurdu. 50 milyondan fazla cihazda (TV, IoT, mobil, giyilebilir teknoloji vs.) var olan Tizen için taze kan, .NET kullanmak için ise başka bir sebep.

Visual Studio için Tizen etkinliğini izlemek için buraya tıklayabilirsiniz.

SQL Server 2016 Service Pack 1 (SP1) duyuruldu

SQL Server 2016 SP1 ile gelen yenilik/değişiklik listesi için buraya tıklayabilirsiniz.

Linux için SQL Server duyuruldu

Bu duyuru var ya bu duyuru, muazzam yenilikçi bir duyuru. Artık Windows OS'yi kullanma zorunluluğunun olmadığı bir dünyada oyun baştan aşağı değişecektir. (Bir yerde okumuştum SQL Server'ın yeniden yazılması söz konusu değil, sadece çerçevesi değiştirilmiş.)

Etkinlik oturumunu izlemek için buraya tıklayabilirsiniz.

Bu duyuruların dışında

  • .NET Core, ASP.NET Core, Entity Framework Core 1.1,
  • Visual Studio Mobile Center Preview.

duyuruları da yapıldı. Etkinlik ile ilgili kısa kısa notlar, haberler ve açıklamalar içeren bu sheet'e göz atmanızı öneririm.

Ek olarak, Microsoft Türkiye Blog sayfasında duyuruları Türkçe bulabilirsiniz.

UWP Community Toolkit

UWP Community Toolkit

Hatırlarsınız eskiden Microsoft'un ASP.NET projelerinde kullanılması için hazırladığı fakat herkesin kullanırken 2 kere düşündüğü 2.sinde ise vazgeçtiği bir AJAX Toolkit'i vardı. Daha sonra AJAX Toolkit'in yerini DevExpress, Telerik vs. gibi hazır kontroller sunan 3.parti kütüphaneler almıştı. Sebebi basit; ihtiyaçtı. Şimdi size anlatacağım UWP Community Toolkit de bu duruma benzer konumda.

UWP, Windows SDK'nın güncellenmesi ile beraber yeni özellikler kazanan bir platform fakat insanların ihtiyaçlarını karşılama konusunda yetersiz olduğu anlar da olabiliyor. Microsoft bunu görüp açık kaynak kodlu bir toolkit hazırlamış: UWP Community Toolkit. Eğer UWP için kod yazdıysanız ne dediğimi anlıyorsunuzdur. En basit örneğiyle Facebook veya Twitter mobil uygulamalarında yukarıdan aşağıya çekildiğinde veri kaynağını güncelleyen bir kontrol (PullToRefreshList) olsa da (hazıra konmak evet) bunu uygulamamızda kullansak demişsinizdir. İşte UWP Community Toolkit ile mümkün.

UWP, HoloLens'ten IoT'ye, Xbox'dan mobile kadar her platforma hitap ettiği için bir çok alanda kullanılabiliyor. Gelelim içerisinde neler olduğuna...

Toolkit 4 bölümden oluşuyor :

  1. Kontroller (HamburgerMenu, AdaptiveGridView vs.),
  2. Servisler (Bing, Facebook, Twitter, LinkedIn vs.),
  3. Bildirimler (LiveTile, Toast vs.),
  4. Animasyonlar (Fade, Scale vs.).

Ek olarak yardımcı metotların (HttpHelper, ImageCache vs.) da bulunduğunu söyleyeyim.

Ben bu yazıyı yazarken versiyon 1.2 de yayınlanmış. Hazır yayınlanmışken incelemek isteyenler için kaynakların arasında onu da belirteyim.

UWP Community Toolkit v1.1 duyurusu için buraya,

UWP Community Toolkit v1.2 duyurusu için buraya,

Kaynak koduna (GitHub) ulaşmak için buraya, dokümantasyona ulaşmak için buraya, örnek uygulamalara indirip denemek isterseniz de buraya tıklayabilirsiniz. UWP Community Toolkit'i kullanacaksanız demoya kesinlikle bakın. İçerisinde direkt hazır XAML kodu bile var. İşinizi kolaylaştıracaktır.

Biraz fazla link verdim farkındayım fakat neler olup bittiğini öğrenmek istiyorsanız aradığınız her şey burada var. Son olarak, versiyon 1.3'te neler olacağını (Roadmap) görmek isterseniz de buraya tıklayabilirsiniz.

Son olarak nasıl indiririm diyenlere => Buyrun UWP Community Toolkit Nuget paketleri

NOT

  1. Visual Studio yüklediğinizde umarım Universal Windows App Development Tools seçeneğini seçmişsinizdir. Bu şartlardan ilki (Visual Studio kurulumu esnasında seçmediyseniz daha sonra installer üzerinden ekleme yapabiliyorsunuz),
  2. UWP uygulamarınızın çalıştırılacağı Windows 10 versiyonu minimum 10586 olmalı.

Bol linkli yazının bonusu

Template 10 - UWP Template Eklentisi

Son zamanlarda UWP (Universal Windows Platform) ile ilgileniyor olmam sayesinde yeni şeyler öğrendim, bu öğrendiklerimi parça parça -eğer siz de Windows 10 uygulama geliştirme işleriyle uğraşıyorsanız- anlatmak isterim. Bunların başında bir template geliyor ve bu template aslında yapmanız gereken işlerin %80'ini sizin için yapıyor. Tamam da neden buradan başlıyoruz? Hemen konuya girelim.

Geçmişte WPF uygulamalar yaptıysanız yani az da olsa XAML/C# biliyorsanız UWP sizin için zor olmayacaktır. Çünkü XAML ile ilgili çok fazla değişiklik yok. UWP'de olup WPF'de olmayan veya tam tersi gibi bir durum söz konusu fakat işler bizler için zorlaşmamış aksine kolaylaşmış. Compiled Binding (x:Bind) işlemlerinden event binding'e çok güzel özellikler eklenmiş ki konumuz bu değil buna ileride de değinmek istiyorum.

Gelelim template (şablon) mevzusuna. UWP application tasarımı için Microsoft'un geliştiricilere sunduğu bazı kurallar var ve sizlerden bunlara uymanız bekleniyor. Uymadığınız takdirde en fazla mağazaya uygulamanız kabul edilmez. Kısacası araştırmam ihtiyaçlarımdan doğdu ve tasarım yapmaktan hiç hoşlanmıyorum, külfet geliyor bana. O yüzden Jerry Nixon adında Microsoft çalışanı abimiz demiş ki "Bir template olsun içerisinde Hamburger Menu'den navigation service'e, Dependency Injection'dan Messenger'a, MVVM'den behavior'lara ve White/Dark tema desteğine kadar her şey olsun ve bu template bir de open source" olsun demiş. Çok da iyi demiş.

Tüm Windows cihaz ailesi ile uyumlu mu bilmiyorum fakat telefon/tablet ve bilgisayarlarda uygulama çok güzel görünüyor. VisualStateManager dahi eklenmiş, ekran küçüldüğü zaman siz bir şey yapmıyorsunuz, Hamburger Menu'nün görünümü kendisi değişiyor. Control görünümü ile ilgili değişiklikleri eklemeniz gerekiyor hepsi bu. Bir örnek göstereyim.

Kısacası sizin layout ile ilgili yapmanız gereken çoğu şey yapılmış. Sürekli sadece layout yükmüş gibi bahsediyorum ama MVVM implement edilmiş, ayarlar konmuş, splash screen'i hazır, NavigationService metotları "buyrun size nasıl yardımcı olabilir" der gibi gözlerinizin içine bakıyor.

Windows SDK Güncellendiğinde Ne Olacak?

Windows işletim sistemi ara ara büyük güncellemeler alıyor ve SDK'lar güncelleniyor. Windows 10 yayınladığı günden bu yana 10240, 10586 ve Anniversary Edition 14393 (Yıldönümü Güncellemesi) versiyonları çıktı ve T10 da bu hıza ayak uydurabiliyor. Hatta Windows Insider (beta katılım) sayesinde yayınlanmadan önce ne gibi değişiklikler geleceği, nelerin değişmesi gerektiği gibi kritik adımları önceden tespit edip T10'u güncelliyorlar. Buna da bir örnek vereyim. Windows 14393 ile gelen UI değişikliklerinden birisi de Hamburger Menu'de seçili olan item'ın solunda "seçili olduğuna dair bir ifade beliriyor" bu da T10'da var.

Soldaki image Windows'un ayarlar menüsü, sağdaki ise benim T10 Template kullanarak yarattığım bir application'ın menüsü.

Gördüğünüz gibi Windows üzerinde yaşanan değişiklikler de T10 Template'e ekleniyor. Ayrıca sizi temin ederim ki güncellemenin çıkmasıyla NuGet üzerinden uygulamamı güncelledim.

T10'u Kullanmalı mıyım? Neden?

UWP için uygulama hazırlayacaksanız kullanmanızı öneririm. Sebepleri ise:

  1. Microsoft'un, dediğim gibi uygulamanızı hazırlarken uymanızı istediği Windows uygulamarına ait belli bir tasarım kalıbı var. Nasıl Google'ın Material Design'ı varsa aynısı Microsoft için de geçerli. Sebebi ise göze ve kullanıma uygun olması,
  2. Sizi bir çok kod yazma işinden kurtarıyor. Dediğim gibi kendi içerisinde implement edilmiş (ve eklenmeye devam edecek) servisler, metotlar var,
  3. Uygulama open source (açık kaynak) ve GitHub üzerinde talepleriniz ciddiyetle dinlenip uygulanabiliyor.

Bu arada size 3 farklı şablon seçeneği sunuluyor. Bunlar :

  1. Blank,
  2. Hamburger,
  3. Minimal.

Evet geldik bu şablonu nerede bulabileceğiniz konusuna. T10 hakkında kod örnekleri, yol haritası, hatalar veya geliştirmeler, Wiki gibi bilgilere GitHub üzerinden erişebilirsiniz. Eklentiyi (template) direkt indirmek istiyorsanız Visual Studio'nun eklentiler kısmından (Tools -> Extensions & Updates) aratarak veya Visual Studio Gallery üzerinden indirebilirsiniz.

NOT : Visual Studio 2015 için geçerlidir.