ASP.NET Core MVC’ye Giriş
ASP.NET Core MVC, platform bağımsız şekilde geliştirilebilir, test edilebilir ve kolayca bakım yapılabilir web uygulamalarının oluşturabilmesini sağlar. .NET Core platformunda çalışır. Bu platformun .NET dünyasından geçiş yapan yazılımcılar için getirdiği en büyük yeniliklerden biri, web uygulamasının sunulabilmesi için IIS’e ihtiyaç duyulmaması. Bu şekilde uygulamanın yayını Kestrel web sunucusu üzerinden açılabilir veya kendi kendini yayımlayacak bir uygulama geliştirilebilir. Yine bu platform içerisinde varsayılan olarak gelen dependency injection desteği ile uygulama içerisindeki bağımlılıkların birbirinden izole edilmesi, test ve bakım maliyetlerinin azalması sağlanmış olur.
ASP.NET Core MVC’de göze çarpan özellikleri routing, model binding, model validation, dependency injection, filters, areas, Web APIs, strongly typed views, tag helpers, ve view components şeklinde sıralamamız mümkün. Aslında .NET Framework üzerinde MVC uygulaması geliştirenlere burada tanıtacağımız özelliklerin büyük çoğunluğu oldukça tanıdık gelecektir. Gelin birlikte bu özelliklere kısaca göz atalım.
Routing (Rota İşlemleri)
ASP.NET Core MVC’deki yönlendirme(rotalama) işlemleri ASP.NET Core route motoru üzerinde kurulu bir şekilde gelmektedir. Bu sayede yönlendirme işlemlerinin iki farklı şekilde yapılabilmesi mümkündür:
- Geleneksel rotalama (Convention-based routing): Önceden olduğu gibi
routes
nesnesi içerisinde bulunanMapRoute
fonksiyonundan yararlanarak uygulama genelindeki rota yönetimini aşağıdaki şekilde sağlanabilir:
routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}");
- Attribute kullanarak rotalama (Attribute routing): Controller sınıfı ve Action metodu üzerindeki satırda aşağıdaki gibi ilgili attribute (
[Route()]
ve[HttpGet()]
) kullanılarak rotalama işlemi yapılmış olur:
[Route("api/musteriler")]
public class MusteriController : Controller
{
[HttpGet("{id}")]
public IActionResult GetMusteri(int id)
{
// Her zamanki yazdığımız kodlar bu alana yazılacak.
}
}
Model Validation (Doğrulama)
Kullanılan model nesnelerinin property bazında hem istemci hem de sunucu tarafında doğrulama işlemlerinin yapılması için model doğrulama amaçlı attribute tipleri .NET Framework’te olduğu gibi .NET Core’da da bulunuyor. Model validasyonu işlemlerinin gerçekleştirilebilmesi için öncelikle model sınıfına ilgili attribute’lerin eklenmesi gereklidir:
using System.ComponentModel.DataAnnotations;
public class MusteriViewModel
{
[Required]
[Adi]
public string Adi { get; set; }
[Required]
[Soyadi]
public string Soyadi { get; set; }
}
Burada eklenilen attribute’ler sayesinde MusteriViewModel modelinin hem istemci hem de sunucu tarafındaki validasyonu otomatik olarak yapılır:
public async Task<IActionResult> MusteriKaydet(MusteriViewModel model, string returnUrl = null)
{
if (ModelState.IsValid)
{
// Eğer validasyon sağlanmışsa müşteri kaydedilir
}
// Validasyon sağlanamamışsa otomatik olarak handle edilir
return View(model);
}
Dependency Injection
ASP.NET Core MVC, ASP.NET Core üzerine kurulu inşa edildiği için ASP.NET Core’daki tüm dependency injection yeteneklerine sahiptir. Dependency injection ve service locator çatısının desteği ASP.NET Core içerisinde gömülü olarak gelmektedir. Inject edilebilecek 4 farklı mod vardır: Singleton, Scoped, Transient ve Instance.
Controller sınıflarındaki constructor içerisine ilgili bağımlılık eklenerek dependency injection yönetimi sağlanmış olur. Ayrıca view dosyalarında da @inject
kullanılarak aynı işlem sağlanabilir.
Öncelikle Startup.cs
‘te bulunan ConfigureServices()
metoduna kullanılacak servisin eklenmesi gereklidir. Buradaki örnekte loglama işlemleri servisinin eklenmesi sağlanır:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<ILoggingService,LoggingService>();
}
Artık ILoggingService
bağımlılığı uygulamaya tanıtılmış durumda. Aşağıdaki şekilde constructor içerisinde ILoggingService bağımlılığının inject edilmesi tamamlanır:
public class MusteriController : Controller
{
private ILoggingService logger;
public MusteriController(ILoggingService logger)
{
this.logger = logger;
}
}
ASP.NET Core’daki Dependency Injection yapısının detaylı incelemesi için Türkçe içerikli bu blog yazısını okumanızı öneririm.
Strongly Typed View
ASP.NET Core MVC, önceden olduğu gibi model ile view’ın güçlü bir şekilde birbirine bağlanmasına olanak verir. Bu sayede özellik sayesinde bir entity için liste, ekleme, güncelleme gibi view’ları kolayca oluşturabilirsiniz. Örneğin uygulamanızda yer alan Musteri adındaki bir entity için aşağıdaki şekilde basit bir listeleme yapabilirsiniz. Sayfanın üst kısmında @model tanımında belirttiğiniz class ile sayfa içerisindeki Model property’si üzerinden nesneye erişebilirsiniz:
@model IEnumerable<Musteri>
<ul>
@foreach (Musteri m in Model)
{
<li>@m.Adi @m.Soyadi</li>
}
</ul>
Tag Helper
Tag helpers, sunucu tarafında HTML elemanlarının oluşturulması ve render edilebilmesi için gerekli olan fonksiyonlardır. ASP.NET Core MVC ile birlikte varsayılan olarak gelen birçok tag helper bulunuyor. Bunlar, formların oluşturulması, ilgili dosyaların yüklenmesi gibi işlemlerde kullanılıyor. Ayrıca kendi tag helper’larımızı da yazabilmemiz mümkün. Bir tag helper’ı aşağıdaki şekilde örnekleyebiliriz:
<label asp-for="Email"></label>
Email modelini kullanarak label oluşturulmasnı sağlayan LabelTagHelper
‘ı kullandık. Çıktısı ise aşağıdaki şekilde olacaktır:
<label for="Email">Email</label>
Web API Desteği
ASP.NET Core MVC’nin, HTTP üzerinden çalışan servislerin oluşturulmasını sağlayan Web API’ye yönelik desteği de verilmiş durumda. Bu sayede Web API ile oluşturulan servislerin varsayılan olarak content negotiation, formatter ve CORS desteği bulunmuş oluyor.
Bulut Uyumlu Ortam Yapılandırma
ASP.NET Core MVC, Development
, Staging
ve Production
gibi ortamlarda uygulama durumunun ortama özgü kontrol edilmesini sağlamak için geliştirilmiş bir yapılandırma sistemi sunar. Bu sayede örneğin development ortamında görüntülenebilecek detaylı hata mesajları, prod ortamında gizlenmiş olur. Veya prod ortamında caching yapısı sunulurken, development ortamında bu özelliğin kapalı olmasını sağlanabilir. ASPNETCORE_ENVIRONMENT
ortam değişkeni ile ilgili sistemin hangi çalışma ortamına sahip olduğu belirlenebilir/değiştirilebilir. Örneğin Windows’ta komut satırında aşağıdaki şekilde atama işlemi yapılır:
set ASPNETCORE_ENVIRONMENT=Development
Bu sayede sadece o anki CMD ekranında ASPNETCORE_ENVIRONMENT
değişkeni set edilmiş olur, ekran kapatıldığında bu değişken kaybolur. Global olarak set etmek için: Denetim Masası > Sistem > Gelişmiş sistem ayarları
menüsünden bu değişkenin kalıcı olarak belirlenmesi sağlanabilir. İlgili atama işlemi yapıldıktan sonra çalışma zamanında ortam değişkeni aşağıdaki şekilde kontrol edilebilir:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
}
Ayrıca environment
tag helper’ı kullanılarak sadece Development süresince JavaScript ve CSS dosyalarının minify edilmemiş hallerinin kullanılması sağlanabilir:
<environment names="Development">
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment names="Staging,Production">
<link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/css/bootstrap.min.css"
asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
<link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
</environment>
6 Comments
Tağı
11 Kasım 2017 at 19:49Çok faydalı yazı.
Teşekkürler
Zafer Ayan
14 Kasım 2017 at 22:22Rica ederim, iyi çalışmalar.
Hakan
29 Aralık 2017 at 07:59Benim merak ettiğim bu uygulamayı nasıl deploy ediyoruz kullanabileceğimiz bir hosting var mı azure dışında linux bir sunucuya nasıl kurulup yayınlanıyor. En büyük eksiklerden biri bu hep bu uygulama oluşturma anlatılıyor ama nasıl canlıya alınacak bilemiyoruz digitalocean da linux bir sisteme nasıl deploy edilir ve http://www.site.com gibi nasıl ulaşılır bu konuda tecrübeniz var ise bir yazı yazabilir misiniz?
Zafer Ayan
8 Ocak 2018 at 14:34Henüz bu konuda bir yazı hazırlamadık. Fakat Digitalocean’da bir droplet oluşturduktan sonra aşağıdaki ingilizce makaleyi takip edebilirsiniz: https://www.codeproject.com/Articles/1066465/Running-ASPNET-and-NET-Core-on-Linux
Teşekkürler,
İyi çalışmalar,
Can
11 Ekim 2018 at 18:03Yıllardır stabil olarak asp.net mvc ve framework olarak jquery kullanıyorum yaptıgım en büyük proje 1000 aktif kullanıcılı bir okul projesi oldu ve hala devam etmekte gerçek anlamda core a geçiş yapılmalımı? Yada bundan sonraki evre olarak core ile devam edilmelimi bu geçişin en büyük faydası ne olacaktır? Bende host edecek sunucu var … Sadece migration a girersek eski projelerde core için gereklilik derecesi ne olmalı? Paylaşım için teşekkürler iyi çalışmalar dilerim.
Zafer Ayan
21 Ekim 2018 at 03:30Merhaba Can,
.NET Core basit ve genişletilebilir yapısından dolayı oldukça başarılı. Microsoft’un Open Source atılımı ile giderek daha yaygın hale gelecektir. Bing.com geçiş yaptı ve bunu bir makalesinde paylaştı (https://blogs.msdn.microsoft.com/dotnet/2018/08/20/bing-com-runs-on-net-core-2-1/)
Şu an yeni bir framework olduğu için mevcut projeni geçirmek yerine bundan sonraki projelerinde core ile devam ederek ve denemeler yaparak karar verebilirsin.
Avantajları ve kıyaslamalar için aşağıdaki linke bakabilirsin:
https://stackoverflow.com/a/37684644/2145076
Teşekkürler,