İlk defa canlı bir serüvenin içerisindeyiz! Bir framework geliştiriliyor, üstelik cross-platform, açık kaynak kodlu ve mimar Microsoft! Duyurular, yeni versiyonlar, etkinlikler ve blog yazıları aldı başını gidiyor. Böylesine hızla büyüyen ve ilgi gören nadir bir süreç, dikkatleri çok çabuk üzerine çekmiş gibi görünüyor. Bulut - [Cloud](https://en.wikipedia.org/wiki/Cloud_computing " target="_blank) dostu, esnek ve hızlı, uygulama bazlı versiyonlanabilen, ölçeklenebilir, modüler yeni nesil bir framework.

Release veya versiyon beklemeksizin bu ortamı irdelemek, üzerinde çalışmak gerekiyor. Kurumsal seviyede bir framework, topluluk gücünü arkasına alarak ve açık kaynak kod deposu olan [Github](https://github.com/aspnet/Home/ " target="_blank) üzerinde her an etkileşime müsait bir şekilde geliştiriliyor! Bu durum bunca yıl etkin bir şekilde kullandığımız mimarilerin kalbine misafir olmak gibi! Bu fırsatı değerlendirerek başlayalım ve bu framework üzerine cross-platform uygulama geliştirebilmek için elimizde ne tip enstrümanlar var inceleyelim.

ASP.NET 5 de öne çıkan başlıca özellikler:

1- Cross Platform

Şu an için Windows, OSX ve Ubuntu işletim sitemleri başta olmak üzere derlenip çalıştırılabilen bir framework. [.NET Platform Standard](https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md " target="_blank) ile uygulamanızın (Web API, Web Site) hangi sistem(ler) üzerinde koşacağını belirleyip geliştirme sürecine başlayabilirsiniz. [ASP.NET 5 MVC 6](http://www.asp.net/vnext " target="_blank) ile desteklenen sistemler için web uygulamaları, [RESTful servisler (Web API)](http://docs.asp.net/projects/mvc/en/latest/getting-started/first-web-api.html " target="_blank) yazabilir ve uygulamalarınızı sanal makineler veya bulut hizmeti sağlayan (Azure, Amazon Web Services, DigitalOcean) markalar üzerinde ücretsiz (belirli bir süreye kadar) test edebilirsiniz.

2- Built-in Dependency Injection

Karmaşık back-end API ve servisleri yönetmek, bağımlıkları olabildiğince azaltmak adına yaygın bir prensip ve patern olarak karşımıza çıkan bu kavram:

IServiceProvider

Interface i ile framework ün merkezinde yer almaktadır.

Bir hizmetin (servis veya API) görevini yerine getirebilmek için ihtiyaç duyduğu tüm gereksinimleri (Diğer servis veya yardımcı sınıfları) rahatça - hiç birinden yeni bir Instance almadan elde edilebilmesini sağlayan çözücü görevini üstlenmiş bir tip olan Resolver:

// Gets the request-specific <see cref="IServiceProvider"/>
public IServiceProvider Resolver
{
    get
    {
        return HttpContext?.RequestServices;
    }
}

sayesinde "bir istek (Request)" boyunca istediğimiz tipleri elde edebiliyoruz. Burada önemli bir husus ise; uygulamamızın Startup yada [Composition Root](http://blog.ploeh.dk/2011/07/28/CompositionRoot/ " target="_blank) olarak isimlendirilen kısmında gerekli kayıtların (Registrations: Dynamic or Static) yapılmış olması. Böylelikle yapının sizi daha kaliteli kod yazmaya, prensipleri uygulamaya götürdüğü anlaşılabiliyor!

Örnekte ASP.NET 5 MVC 6 da varsayılan olarak InMemory-Cache olarak register edilmiş IDistributedCache interface i için Redis-Cache tipinin [Singleton](http://docs.asp.net/en/latest/fundamentals/dependency-injection.html#service-lifetimes-and-registration-options " target="_blank) olarak kullanılabilmesi için:

// This will override any previously registered
// IDistributedCache service.
services.AddSingleton<IDistributedCache, RedisCache>();

kaydının Startup sınıfında koleksiyona eklenmesi yeterli olmaktadır.
(Detaylıca [Dependency Injection ](https://en.wikipedia.org/wiki/Dependency_injection " target="_blank))

3- HTTP request pipeline

ASP.NET 5 bir istekle (Request) ilgili tüm süreci masamıza servis ediyor! Baştan sona tüm scope bir çok farklı operasyonla ( loglama, filtreleme, cevap işleme ) desteklenebiliyor. Burada [Middleware](http://docs.asp.net/en/latest/fundamentals/middleware.html " target="_blank) kavramına basitçe değinmek gerek;
İster:

app.Run(async context =>
{
    await context.Response.WriteAsync("Hello, World!");
});

veya [Github/UseMiddleware](https://github.com/gencebay/CloudBuilder/blob/master/src/Cloud.Server/Extensions/BuilderExtensions.cs " target="_blank)

public static class BuilderExtensions
{
    public static void UseSocket(this IApplicationBuilder builder)
    {
        builder.UseMiddleware<SocketRequestMiddleware>();
    }
}

örneklerindeki yöntemler ile uygulama süreç ve isteklerinin genişletilebilmesi sağlanabiliyor.

4- Side-By-Side Versiyonlama

ASP.NET 5 ve .NET Core tabanlı bir uygulama çalıştığı ortamda her hangi bir ön paket - dahili ([GAC](https://msdn.microsoft.com/en-us/library/yf1d93sz(v=vs.110).aspx " target="_blank)) depo gerektirmez. Kendi klasör yapısında [project.json](https://github.com/aspnet/Home/wiki/Project.json-file " target="_blank) dosyasında belirtilen paketleri [Nuget (Remote or Cache)](https://www.nuget.org/ " target="_blank) üzerinden elde etmek süretiyle çalışır ve versiyonlama özelliklerini kullanır. Geliştirtiğiniz kütüphaneleri ister yerel ister uzak paket sağlayıcıları ([Nuget](https://www.nuget.org/ " target="_blank), [MyGet](https://myget.org/ " target="_blank)) sayesinde oluşturup versiyonlayıp yayınlayabilirsiniz. Bir diğer gelişme ise [KoreBuild ve Sake](https://github.com/aspnet/Universe " target="_blank) ile Continuous Integration - Build otomasyonu. [AppVeyor](https://www.appveyor.com/ " target="_blank)

5- JSON Formatında Konfigurasyon

Tercihe göre [Strongly typed](https://en.wikipedia.org/wiki/Strong_and_weak_typing " target="_blank) veya [Dictionary](https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx " target="_blank) formatında veri tipleriyle uyumlu (mapping) [JSON](http://www.json.org/ " target="_blank) formatında uygulama ayar dosyaları oluşturup bunları uygulamanıza şu şekilde dahil edebilir (Container Registration):

services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

ve Controller veya Service sınıflarınızda

private IOptions<AppSettings> AppSettings;

public HomeController(IOptions<AppSettings> appSettings)
{
    AppSettings = appSettings;
}

built-in dependency injection özelliği sayesinde nesneyi elde edilebilirsiniz.

6- [xUnit](http://xunit.github.io/docs/getting-started-dnx.html " target="_blank) Runner [DNX](http://gencebaydemir.com/-net-ile-cross-platform/ " target="_blank) - Unit Tests

Kurumsal proje veya bir girişim için kurgulamaya çalıştığımız altyapı, araçlar, ek uygulamalar ve entegre olunan sistemlerin beraberinde getirdiği karmaşıklığı yönetmek her geçen gün daha fazla efor ve insan kaynağı gerektiyor. Uygun kurgulanmış bir mimari ile birim ve operasyon testlerinizi ASP.NET 5' in System.Web namespace inden arındırılmış yeni kurgusu ile tamamlayabilirsiniz.

IHttpContextAccessor 

tipindeki interface ile veya

public HttpContext GetHttpContext(string contentType = "application/json")
    {
        var request = new Mock<HttpRequest>();
        var headers = new Mock<IHeaderDictionary>();
        request.SetupGet(f => f.ContentType).Returns(contentType);

        var httpContext = new Mock<HttpContext>();
        httpContext.SetupGet(c => c.Request).Returns(request.Object);
        httpContext.SetupGet(c => c.Request).Returns(request.Object);
        return httpContext.Object;
    }

yardımcı bir fonksiyon ile [Mock HttpContext](https://en.wikipedia.org/wiki/Mock_object " target="_blank) nesnesi elde edebilirsiniz.

[Visual Studio Test Explorer](https://msdn.microsoft.com/en-us/library/hh270865.aspx " target="_blank), otomatize edilmiş build veya command line aracılığıyla testlerinizi çalıştırabilirsiniz.

project.json:

"commands": {
  "test": "xunit.runner.dnx"
}

command line:

dnx test

7- Performans Testleri - Benchmarks

Bir çok farklı tipte içerik ve eşzamanlı istekler oluşturarak uygulamanızın performansını ölçümleyebilirsiniz. [Modern http enchmarking Tool - wrk](https://github.com/wg/wrk " target="_blank) ve [ASP.NET Bencmarks](https://github.com/aspnet/benchmarks " target="_blank)

[Cross Platform ASP.NET 5 Örnek uygulama - Github](https://github.com/gencebay/CrossPlatformApp " target="_blank)