.NetStandard nedir? .NetCore, .NetFramework ve diğer .Net Platformları ile ilişkisi nasıl? (Bölüm 1)
Selamlar arkadaşlar. Bu yazımda .NetStandard ın ne olduğunu, çıkış amacını, .Net platformları arasında ne tür bir öneme sahip olduğunu anlatıp, birçok kişiden duyduğum “Ya şimdi bu .netcore çıktı, netstandard geldi, zaten netframework vardı, ne oluyor arkadaş, ben neyi nasıl kullanacağım?” şeklindeki kafa karışıklıklarını tamamen gidermeye çalışacağım. Ayrıca farklı .Net platformları arasındaki kod paylaşım tekniklerine değinip, .NetStandard’ın PCL(Portable Class Library)’den farkına da değineceğim.
Öncelikle şuradan başlayalım, farklı .NET platformları derken nelerden bahsediyoruz?
- .NET Core
- .NET Framework
- Mono
- Xamarin.iOS
- Xamarin.Android
- Xamarin.Mac
- Universal Windows Platform
- Windows
- Windows Phone
- Windows Phone Silverlight
- Unity
Evet aslında yukarıda ki listeye baktığımıza, artık bir kişinin “Ben .net developer’ım” demesiyle birlikte aslında ne kadar geniş çapta işler çıkartabileceğini görebiliriz 🙂 Birbirinden farklı ve güzel birçok platform mevcut. Oyun geliştirmek, iOS, Android ve WP ye native mobil uygulamalar yazmak, Web uygulamaları geliştirmek, Windows, Xbox, Console vs bir çok ihtiyaç için birçok uygulamayı .Net kullanarak geliştirebiliyoruz. Fakat bu yelpaze genişledikçe, Visual Studio daki Solution’lar büyüdükçe, Client’ların arayüz istekleri değiştikçe, ortaya çıkan en büyük soru şu oluyor
– Ben tüm projemde ortak olması gereken kodları nasıl paylaştıracağım?
Ortak olması gereken kodlar nelerdir biraz düşünelim;
- Application Services katmanı olabilir. Uygulamanın tüm business ihtiyacını yazacağımız katmanı ortak kullanılacak şekilde bir kere yazmak mantıklı olabilir.
- Ortak bir Data Acces Katmanı olabilir. Repository, UnitOfWork vs gibi pattern ler ile ihtiyacımıza göre düzenleyip yazdığımız, belki bir ORM (EntityFramework, NHibernate) veya mikro ORM (Dapper vs.) kullandığımız, ortak bir data access katmanı mantıklı olabilir.
- Ortak bir Networking Layer olabilir. Uygulamalarımız dış dünya ile haberleşirken, API’lar ile yapacakları haberleşmeleri ayrı ayrı yazmak istemeyiz. Tek bir yerde, kurallara uygun, düşünülmüş bir katman yazmak çok daha faydalı olacaktır.
- DTO (Data Transfer Object) – POCO (Plain Old CLR Objects) lar ortak bir yerde olabilir. Evet spesifik projeler içerisinde model şekilleri değişip, client’a özel modeller oluşturmak gerekebilir. Ama en nihayetinde DB’den çıkan entity leri Data Access den bir üst level a taşımamak mantıklı olucaktır. Bu yüzden ortak bir dto katmanı mantıklı olabilir.
- Bunların dışında Cross-Cutting-Concerns denilen, tüm uygulamalarda kullanılacak olan, Log, Security, Cache vb. gibi fonksiyonaliteleri bir abstraction olarak ortak bir yerde yazmak mantıklı olabilir.
Peki, evet bunları tek bir yerde yazalım ama, farklı .Net platformlarında bunları nasıl kullanacağım? Kullanabilir miyim?
Şüphesiz ki sorunun cevabı evet olmalı =) Bunu nasıl başaracağımıza bakalım. .NetStandard’tan önce bunu yapabilmek için 2 popüler yöntemimiz mevcut idi.
- Shared Asset Projects (SAP)
- Protable Class Library (PCL)
SAP: File linking gibi çalışan, Compiler Directive’ler kullanarak, platform spesifik kodlarınızı yazabileceğimiz bir teknikti. Örneğin
#if __IOS__ path = "iOS"; #else
şeklinde SAP projesi içerisindeki bir .cs dosyasında, sadece Xamarin.iOS için çalışmasını istediğimiz bir kod yazabilirdik. Projeler derlendiğinde, SAP ayrı bir dll olarak değil, her bir referans olduğu projenin içerisine gömülmüş olarak hayatını sürdürürdü. Fakat bu yöntem tahmin edersiniz ki ortaya çok yönetilebilir olmayan ve karmaşık kodlardan oluşan projeler çıkartırdı.
PCL: SAP projeleri ile ilerlemenin pek yönetilebilir olmaması ve kod karmaşıklığına sebep olması yüzünden PCL kullanmak daha da mantıklı oluyordu. Fakat bu durumda da karşımıza farklı sıkıntılar çıkıyordu.
Şöyle düşünelim, bir solution var. İçerisinde her katman ayrı ayrı yazılmış güzelce. Fakat önyüz olarak, Silverlight, Xamarin.iOS, Web ve Desktop olması gerekiyor. Tüm bu farklı .Net platformları kendine has, kendine özel sınıfları ve fonskiyonaliteleri barındıran farklı Base Class Library (BCL) ler kullanıyor. Peki bunların arasında ortak kümeyi nasıl bulacağız? Ya kulllandığımız özel bir sınıf, Web, Desktop ve Sliverlight ile uyumlu ama Xamarin.iOS ile uyumlu değilse ne olacak?
İşte bu problemlerle sonradan karşılaşıp kötü sürprizler yaşamamak için, .net ekibi şöyle bir çözüm getirdi.
- Farklı PCL Profiles
Ne kadar farklı .Net platformları arasında kod paylaşmak istiyorsanız, kullanabileceğiniz ortak API sayısı da ters orantılı olarak düşüyordu. Yani sadece Web ve Desktop önyüzü ile proje geliştirirken neredeyse tüm .Net Framework üne ait sınıfları kullanabilirken, işin içine Silvelight, Xamarin, WP vs girmeye başladığında birçok sınıfı kullanamaz hale geliyordunuz. Örnek bir listeye bakalım
PCL Profile | PCL Platforms |
---|---|
Profile7 | .NET Framework 4.5, Windows 8 |
Profile31 | Windows 8.1, Windows Phone Silverlight 8.1 |
Profile32 | Windows 8.1, Windows Phone 8.1 |
Profile44 | .NET Framework 4.5.1, Windows 8.1 |
Profile49 | .NET Framework 4.5, Windows Phone Silverlight 8 |
Profile78 | .NET Framework 4.5, Windows 8, Windows Phone Silverlight 8 |
Profile84 | Windows Phone 8.1, Windows Phone Silverlight 8.1 |
Profile111 | .NET Framework 4.5, Windows 8, Windows Phone 8.1 |
Profile151 | .NET Framework 4.5.1, Windows 8.1, Windows Phone 8.1 |
Profile157 | Windows 8.1, Windows Phone 8.1, Windows Phone Silverlight 8.1 |
Profile259 | .NET Framework 4.5, Windows 8, Windows Phone 8.1, Windows Phone Silverlight 8 |
İşin içine Xamarin, UWP vs girmeye başladıkça çarşı hepten karışmaya başlıyor, API sayısı iyice azalıyor, tüm projelerinizde kullandığınız popüler bir nuget paketini bile ortak projelerinize ekleyemez oluyordunuz, çünkü ilgili PCLProfile ında çalışmayabiliyordu.
Peki ne olacak? Belli ki bu kod paylaşım işine daha kalıcı bir çözüm lazım. Aslında gerekli olan, farklı .Net platformlarının uyması gereken bir standard olması lazım 🙂
Bunun da farkına varan Microsoft .NetStandard ı hayatımıza kattı.
Nedir Bu .NetStandard?
Aslında işin derinine inmeden, .NetStandard ı ve 2.0 ile ilgili bazı özellikleri özetleyerek bu bölümü sonlandıralım.
- .NetStandard’ı tüm .Net platformlarının bundan böyle implemente etmek zorunda olduğu bir Interface gibi düşünebiliriz.
- Birçok API ı içerisinde barındıran, tüm platformların da bunları implement etmek zorunluluğu sayesinde, farklı .Net platformlarını birleştiren ve gelecekteki ayrışmaları önleyecek bir Unified BCL olarak düşünebiliriz 🙂 2.0 ile beraber ortak API sayısı 32.000 i geçti ve bir önceki versiyona oranla(1.6) %142 büyüdü. Bu çok ciddi bir oran. Aşağıda bazı Temel API ları listeliyorum.
- Xml (Xlinq, XmlDocument, Xsd, Xsl, Xpath)
- Serialization (DataContract, Binary Formatter, XML)
- Networking (Http, Sockets, WebSockets, Mail)
- IO (Files, Compression, MMF)
- Threading (Thread, ThreadPool, Task)
- Core (Primitives, Collections, Linq, Interop, Reflection)
- .NetStandard 2.0 ile beraber gelen bir uyum sağlama katmanı sayesinde, netstandard kütüphanelerinizden sayısı her geçen gün artan .NET Framework binary leri referance alabileceksiniz, Ve Tabii ki, önceki tüm .NetStandard versiyonlarına ait API larıda kullanabileceksiniz.
- .NetStandard artık gelecekte PCL in yerini alacak, bu yüzden şuandan itibaren yeni projelerinizin tümünde kod paylaşımı olarak, .Netstandard ı tercih edebilirsiniz.
Hazır PCL projelerinden bahsetmişken ve .NetStandard ın gelecekte PCL in yerini alacağını söylemişken, yukarıdaki PCL Profile tablomuza birde Profile ların uyumlu olduğu .NetStandard versiyonlarını ekleyip gösterelim. Bu profile lar ile mevcut proje geliştirenler, PCL yerine ilgili .NetStandard kütüphanelerine geçekten çekinmesinler =)
PCL Profile | .NET Standard | PCL Platforms |
---|---|---|
Profile7 | 1.1 | .NET Framework 4.5, Windows 8 |
Profile31 | 1.0 | Windows 8.1, Windows Phone Silverlight 8.1 |
Profile32 | 1.2 | Windows 8.1, Windows Phone 8.1 |
Profile44 | 1.2 | .NET Framework 4.5.1, Windows 8.1 |
Profile49 | 1.0 | .NET Framework 4.5, Windows Phone Silverlight 8 |
Profile78 | 1.0 | .NET Framework 4.5, Windows 8, Windows Phone Silverlight 8 |
Profile84 | 1.0 | Windows Phone 8.1, Windows Phone Silverlight 8.1 |
Profile111 | 1.1 | .NET Framework 4.5, Windows 8, Windows Phone 8.1 |
Profile151 | 1.2 | .NET Framework 4.5.1, Windows 8.1, Windows Phone 8.1 |
Profile157 | 1.0 | Windows 8.1, Windows Phone 8.1, Windows Phone Silverlight 8.1 |
Profile259 | 1.0 | .NET Framework 4.5, Windows 8, Windows Phone 8.1, Windows Phone Silverlight 8 |
Bu bölümü burada sonlandıralım. Bir sonraki bölüm de .NetStandard da ile ilgili yazmaya devam edeceğim. İşin biraz daha otaya çıkışını, biraz daha derinini öğrenmek isterseniz, bir sonraki yazımda görüşek üzere 🙂
Yardımcı kaynaklar:
https://github.com/dotnet/standard/blob/master/docs/faq.md
https://docs.microsoft.com/en-us/dotnet/standard/net-standard
https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/
https://docs.microsoft.com/en-us/dotnet/api/?view=netstandard-2.0