DevNot Istanbul 2017 – Asp.Net Core Day Semineri
Selamlar,
11 Kasım 2017’de İstanbul Medeniyet Üniversitesinde DevNot .Net Core Day etkinliğine konuşmacı olarak katıldım. En başta .Net Core 2.0 ile hayatımıza giren yenilikleri inceledik. Daha sonra, .Net Standard 2.0, .Net Core, ve .Net Framework arasındaki farkları hep beraber tartıştık.
Daha sonra .Net Core 2.0 ile gerçek bir web uygulaması yazamaya başladık. Mac ortamında OsX işletim sisteminde Cross platform uygulama geliştirirken, aynı zamanda kullanılabilecek alternatif toolar hakkında fikir sahibi olma fırsatı bulduk. Ide olarak “Visual Studio Code”, Database Manager olarak “SqlPro for Msql” ve web serviceslerini monitor amaçlı “Paw” gibi araçları hep beraber inceledik.
Öncelikle .Net Core WebApi bir services uygulaması yazdık. İlk adım olarak aşağıdaki gibi bir Customer Model oluşturduk.
Model/Customer.cs:
1 2 3 4 5 6 7 8 |
public class Customer{ public int ID { get; set; } public string Name { get; set; } public string Surname { get; set; } public int Age { get; set; } public decimal Payment { get; set; } public string Address { get; set; } } |
Daha sonra DB işlemleri için .Net Core Entityframework kullandık ve bunun için aşağıdaki CustomerContext: DBContext’i oluşturduk. Sql DevnotDB Azure’da bulunmaktadır.
DAL/CustomerContext.cs
1 2 3 4 5 6 7 8 |
using Microsoft.EntityFrameworkCore; public class CustomerContext:DbContext{ public DbSet<Customer> Customers{get;set;} override protected void OnConfiguring(DbContextOptionsBuilder optionsBuilder){ optionsBuilder.UseSqlServer("Server=tcp:devnot.database.windows.net,1433;Initial Catalog=DevnotDB;Persist Security Info=False;User ID=******;Password=******;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"); } } |
Sıra geldi ilk WebApi servisimizi yazmaya. Bu servisde klasik rude işlemleri aşağıdaki gibi yapılmaktadır. Customer DB’sine göre Get, Get ByID ve Update işlemleri yapılmaktadır.
CustomerController.cs: WebApi servisinden ilgili Customer datasının çekildiği ve güncellendiği sayfadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; namespace customerService.Controllers { [Route("api/[controller]")] public class CustomersController : Controller { // GET api/values [HttpGet] public List<Customer> Get() { using(CustomerContext dbContext=new CustomerContext()) { return dbContext.Customers.ToList(); } } // GET api/values/5 [HttpGet("{id}")] public Customer Get(int id) { using(CustomerContext dbContext=new CustomerContext()) { return dbContext.Customers.FirstOrDefault(cus=>cus.ID==id); } } // POST api/values [HttpPost] public void Post([FromBody]Customer _customer) { using(CustomerContext dbContext=new CustomerContext()) { var customer=dbContext.Customers.FirstOrDefault(cus=>cus.ID==_customer.ID); customer.Address=_customer.Address; customer.Age=_customer.Age; customer.Name=_customer.Name; customer.Payment=_customer.Payment; customer.Surname=_customer.Surname; dbContext.SaveChanges(); } } } } |
WebApi servisinin .Net Core ile default 5000 portundan yayımlanması yerine bizim belirleyeceğimiz 5000 portundan yayımlanması için Program.cs’de BuildWebHost() methoduna aşağıdaki gibi değiştirilir.
Program.cs/BuildWebHost:
1 2 3 4 5 6 |
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseUrls("http://localhost:1453") .Build(); } |
Şimdi sıra geldi bu web servisini kullanan Mvc projesini .Net Core ile oluşturmaya. Aşağıda, Mvc üzerinde bir WebApi services’ine yapılan istek üzerinde geçilen işlem adımları gösterilmektedir.
HomeController.cs: Aşağıda, Get ve Set işlemlerinin yapıldığı Mvc sayfalarına ait Action methodlar tanımlanmıştır. Tüm webapi işlemleri asenkron yapılıp, serialize ve deserialize işlemleri için “Newtonsoft” kullanılmıştır. Ayrıca ilgili webapi servisine request işlemleri için “HttpClient” kullanılmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using customerMvc.Models; using System.Net.Http; using Newtonsoft.Json; namespace customerMvc.Controllers { public class HomeController : Controller { public async Task<IActionResult> Index() { using(HttpClient client=new HttpClient()){ var data=await client.GetAsync("http://localhost:1453/api/customers/"); var model=JsonConvert.DeserializeObject<List<Customer>>(data.Content.ReadAsStringAsync().Result); return View(model); } } public async Task<IActionResult> Detail(int ID){ using(HttpClient client=new HttpClient()){ var data=await client.GetAsync($"http://localhost:1453/api/customers/{ID}"); var model=JsonConvert.DeserializeObject<Customer>(data.Content.ReadAsStringAsync().Result); return View(model); } } public async Task<IActionResult> Update(Customer customer){ using(HttpClient client=new HttpClient()){ var data=JsonConvert.SerializeObject(customer); HttpContent content=new StringContent(data,System.Text.Encoding.UTF8,"application/json"); await client.PostAsync("http://localhost:1453/api/customers",content); return RedirectToAction("Index"); } } public IActionResult Error() { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } } } |
Index.cshtml: Tüm müşteri kaydının gösterildiği sayfadır. Model olarak gene burada, WebApi servisinde kullanılan Customer sınıfı kullanılmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
@model List<Customer> <div class="container"> <div class="jumbotron"> <h3>Devnot .NET Core & Mvc</h3> </div> <hr> <table class="table"> <thead> <th></th> <th>ID</th> <th> Ad</th> <th>Soyad</th> <th>Yaş</th> <th>Maaş</th> <th>Adres</th> </thead> <tbody> @foreach(var customer in Model) { <tr> <td> <a href="/Home/Detail/@customer.ID"><input type="button" value="Detail" class="btn btn-success"></a> </td> <td> @customer.ID </td> <td>@customer.Name</td> <td>@customer.Surname</td> <td>@customer.Age</td> <td>@customer.Payment</td> <td>@customer.Address</td> </tr> } </tbody> </table> </div> |
Detail.cshtml: Seçilen bir müşterinin detayının gösterildiği bir sayfadır. Ayrıca müşteri bilgilerinin güncelleme işlemi de yine bu sayfa üzerinden “FormPost” ile yapılmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
@model Customer <div class="container"> <div class="jumbotron"> <h3>Devnot Customer Detail</h3> </div> <hr> @using(Html.BeginForm("Update","Home",FormMethod.Post)) { <table class="table"> <tr> <td> Ad: </td> <td> <input type="text" value="@Model.Name" id="Name" name="Name"> </td> </tr> <tr> <td> Soyad: </td> <td> <input type="text" value="@Model.Surname" id="Surname" name="Surname"> </td> </tr> <tr> <td> Yaş: </td> <td> <input type="text" value="@Model.Age" id="Age" name="Age"> </td> </tr> <tr> <td> Payment: </td> <td> <input type="text" value="@Model.Payment" id="Payment" name="Payment"> </td> </tr> <tr> <td> Adres: </td> <td> <textarea cols="30" rows="5" id="Address" name="Address">@Model.Address</textarea> <input type="submit" value="Güncelle" class="btn btn-warning"> </td> </tr> </table> <input type="hidden" id="ID" name="ID" value="@Model.ID"> } |
Cumartesi sabahını bana ayıran bu yoğun sayıdaki tüm katılımcılara, öncelikle çok teşekkür eder, seminer sırasında ve sonrasında yaptıkları paylaşımlar ve bana verdikleri yukarıdaki anlamlı hediyeden dolayı hepsinin gözlerinden öperim :) Ayrıca başta Uğur Umutluoğlu ve tüm Devnot ekbine, böyle güzel bir etkinliği hazırladıkları ve bana da bu sunum fırsatını verdikleri için çok teşekkür ederim.
Yeni bir seminerde görüşmek üzere hoşçakalın.
Source Code: http://www.borakasmer.com/projects/devnotCore.zip
Seminer Kaydı:
Githubda yokdu, sonunda buldum kodları.
Teşekkürler !