Professional Documents
Culture Documents
of Contents
Introduction 1.1
İlk Uygulamanız 1.2
SDK'yi indirin 1.2.1
C# ile Merhaba Dünya 1.2.2
ASP.NET Core Projesi Oluşturma 1.2.3
MVC temelleri 1.3
Kontrolör Oluşturma 1.3.1
Model Oluşturma 1.3.2
Görüntü(View) oluşturma 1.3.3
Servis sınıfı ekleme 1.3.4
Bağımlı Enjeksiyon Kullanma 1.3.5
Kontrolörü Tamamlama 1.3.6
Ekstra paket Ekleme 1.4
Veri Tabanı Kullanma 1.5
Veri Tabanına Bağlanma 1.5.1
İçeriği Güncelleme 1.5.2
Göç Oluşturma 1.5.3
Yeni Servis Sınıfı Oluşturma 1.5.4
Yeni Özellikler Ekleme 1.6
2
Yeni Yapılacak Maddesi Ekleme 1.6.1
Maddeleri Onay Kutusu ile Tamamlama 1.6.2
Güvenlik ve Kimlik 1.7
Facebook Girişi Ekleme 1.7.1
Kimlik Kontrolü 1.7.2
Uygulama İçerisinde Kimlik Kullanma 1.7.3
Role Göre Yetkilendirme 1.7.4
Otomatik Test 1.8
Unit Testi 1.8.1
Integration Testi 1.8.2
Uygulamanın Dağıtılması 1.9
Azure'a Dağıtma 1.9.1
Docker ile Dağıtma 1.9.2
Sonuç 1.10
3
Introduction
Giriş
ASP.NET Core El Kitabı kitabına başladığınız için
teşekkürler. Bu kısa kitabı yazmamın amacı ASP.NET
Core 2.0 hakkında bilgi almak isteyen yazılımcılara kolay
bir başlangıç yapmalarını sağlamak. Bu kitapta yeni
framework ve bu framework ile nasıl web uygulamaları
yapılacağını göreceksiniz.
4
Introduction
Başlamadan Önce
Bu projenin tamamlanmış halin
GitHub'da(https://www.github.com/nbarbettini/little-
aspnetcore-todo) mevcut, bilgisayarınıza indirip kendi
versiyonunuz ile kıyaslayabilirsiniz. GitHub .
Bu kitabın ingilizcesine
buradan(https://github.com/nbarbettini/little-aspnetcore-
book) erişebilirsiniz. Ben çeviri işlemlerini yapacağım ve
bunu Türkçe kitap olarak web ortamında yayınlayacağım.
5
Introduction
6
Introduction
7
Introduction
8
Introduction
9
Introduction
10
İlk Uygulamanız
İlk Uygulamanız
ASP.NET Core kullanarak ilk uygulamanızı yazmaya hazır
mızınız?
11
İlk Uygulamanız
12
SDK'yi indirin
SDK'yi indirin
".net core indir" diye arattırıp Microsoft'un web sitesinde
bulunan yönergeleri inceleyerek platformunuza .NET
Coru'u indirin. Bilgisayarınıza yükledikten sonra dotnet
komut satırı aracı ile (CLI) her şeyin doğru çalıştığına
emin olmak için
dotnet --version
2.0.0
dotnet --info
Product Information:
Version: 2.0.0
Commit SHA-1 hash: cdcd1928c9
Runtime Environment:
OS Name: Mac OS X
OS Version: 10.12
(more details...)
13
SDK'yi indirin
14
C# ile Merhaba Dünya
cd Documents
CsharpHelloWorld.csproj
15
C# ile Merhaba Dünya
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
</Project>
Program.cs
16
C# ile Merhaba Dünya
using System;
namespace CsharpHelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
dotnet run
Hello World!
17
C# ile Merhaba Dünya
18
ASP.NET Core Projesi Oluşturma
cd ..
dotnet run
19
ASP.NET Core Projesi Oluşturma
20
ASP.NET Core Projesi Oluşturma
21
ASP.NET Core Projesi Oluşturma
22
ASP.NET Core Projesi Oluşturma
23
MVC temelleri
MVC Temelleri
Bu bölümde ASP.NET Core MVC sistemini inceleyeceğiz.
MVC (Model-View-Controller) web uygulamaları
geliştirmek için kullanacağımız ve neredeyse tüm web
iskeletlerinde kullanılan ( Ruby on Rails ve Express ) bir
kalıptır. Ayrıca Angular gibi ön yüz iskeletlerinde de
kullanılmaktadır. IOS ve Android üzerinde de yine
uygulama yazmak için MVC benzeri bir yapı
kullanılmaktadır.
24
MVC temelleri
Ne Yapacağız
MVC üzerinde yapılan "Merhaba Dünya" uygulaması
"Yapılacaklar Listesi" uygulamasıdır. Küçük ve basit bir
projedir fakat MVC'nin tüm bölümlerini kullanmanız
gerekmektedir. Bu da büyük uygulamalarda
kullanacağınız çoğu konsepti kapsamaktadır.
25
MVC temelleri
26
Kontrolör Oluşturma
Kontrolör Oluşturma
Hali hazırda Controller klasöründe HomeController gibi
ana sayfayı gösteren bir kontrolör dahil birkaç kontrolör
bulunmaktadır. Sunucumuz çalıştığında tarayıcıdan
http://localhost:5000 adresine gittiğimizde bize o
Controllers/TodoController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
namespace AspNetCoreTodo.Controllers
{
public class TodoController : Controller
{
// Aksiyonlar buraya gelecek
}
}
27
Kontrolör Oluşturma
28
Kontrolör Oluşturma
29
Model Oluşturma
Model Oluşturma
İki türlü model sınıfı bulunmaktadır: Yapılacaklar
maddesini veritabanında temsil eden sınıf. Buna entity de
denilmektedir. İkincisi ise bu modeli önyüze göndermeye
yaran modeldir. Her ikiside model olarak
tanımlanabileceğinden dolayı biz ikincisine Görüntü
Modeli diyeceğiz.
Models/TodoItem.cs
using System;
namespace AspNetCoreTodo.Models
{
public class TodoItem
{
public Guid Id { get; set; }
30
Model Oluşturma
31
Model Oluşturma
using System.Collections.Generic;
namespace AspNetCoreTodo.Models
{
public class TodoViewModel
{
public IEnumerable<TodoItem> Items { get; set
; }
}
}
32
Model Oluşturma
zamanı geldi.
33
Görüntü(View) oluşturma
Görüntü(View) Oluşturma
ASP.NET Core'da görüntü Razor Şablon Dili üzerine
kuruludur. Bu HTML ile C# kodunu birleştirebilmemizi
sağlar. ( Eğer daha öncesinde Javascript'de Jade/Pug
veya Handlebars, Javada Thymeleaf kullandıysanız ana
hatlarıyla ne yaptığımızı anladınız demektir)
34
Görüntü(View) oluşturma
Views/Todo/Index.cshtml
@model TodoViewModel;
@{
ViewData["Title"] = "Yapılacaklar Listesini Yöne
t";
}
35
Görüntü(View) oluşturma
<td>@item.DueAt</td>
</tr>
}
</table>
36
Görüntü(View) oluşturma
Dosya düzeni
Dosyanın içerisine baktığınızda <body> veya <footer>
nerede diyebilirsiniz. Görüntü dosyaları daha kolay
çalışabilmemiz için Views/Shared/_Layout.cshtml
içerisinde tanımlanır. Bizim oluşturduğumuz yeni sayfa
dinamik olarak değişen içerik bölümüne gelir.
wwwroot/css/site.css
div.todo-panel {
margin-top: 15px;
}
table tr.done {
text-decoration: line-through;
color: #888;
}
37
Görüntü(View) oluşturma
38
Servis sınıfı ekleme
39
Servis sınıfı ekleme
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using AspNetCoreTodo.Models;
namespace AspNetCoreTodo.Services
{
public interface ITodoItemService
{
Task<IEnumerable<TodoItem>> GetIncompleteIte
msAsync();
}
}
40
Servis sınıfı ekleme
IEnumerable<TodoItem> yerine
Task<IEnumerable<TodoItem>> döndürmemiz
gerekmektedir.
41
Servis sınıfı ekleme
Services/FakeTodoItemService.cs
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using AspNetCoreTodo.Models;
namespace AspNetCoreTodo.Services
{
public class FakeTodoItemService : ITodoItemServ
ice
{
public Task<IEnumerable<TodoItem>> GetIncomp
leteItemsAsync()
{
// Return an array of TodoItems
IEnumerable<TodoItem> items = new[]
{
new TodoItem
{
Title = "Learn ASP.NET Core",
DueAt = DateTimeOffset.Now.AddDa
ys(1)
},
new TodoItem
{
Title = "Build awesome apps",
DueAt = DateTimeOffset.Now.AddDa
ys(2)
}
};
return Task.FromResult(items);
}
}
42
Servis sınıfı ekleme
43
Bağımlı Enjeksiyon Kullanma
yapın.
44
Bağımlı Enjeksiyon Kullanma
using AspNetCoreTodo.Services;
45
Bağımlı Enjeksiyon Kullanma
// ...
}
46
Bağımlı Enjeksiyon Kullanma
benzemektedir.
47
Bağımlı Enjeksiyon Kullanma
Startup.cs
services.AddMvc();
}
48
Bağımlı Enjeksiyon Kullanma
services.AddScoped<ITodoItemService, FakeTodoItemSer
vice>();
49
Kontrolörü Tamamlama
Kontrolörü Tamamlama
Artık kontrolörümüzü tamamlayabiliriz. Artık
kontrolörümüzün servis katmanına bağlandığını
varsayabiliriz. Bu servisten aldığımız veriler ile daha önce
oluşturduğumuz TodoViewModel oluşturup bunu önyüze
gönderebiliriz.
Controllers/TodoController.cs
return View(model);
}
Test
50
Kontrolörü Tamamlama
51
Ekstra paket Ekleme
52
Ekstra paket Ekleme
göreceksiniz.
Humanizer'ı Görüntü
dosyamızda ( View ) kullanma
53
Ekstra paket Ekleme
@model TodoViewModel;
@using Humanizer;
// ...
<td>@item.DueAt.Humanize()</td>
54
Ekstra paket Ekleme
55
Veri Tabanı Kullanma
56
Veri Tabanı Kullanma
57
Veri Tabanına Bağlanma
oluşturduğunuzdan dolayı;
bulunur.
58
Veri Tabanına Bağlanma
services.AddDbContext<ApplicationDbContext>(options
=>
options.UseSqlite(Configuration.GetConnectionStr
ing("DefaultConnection")));
bağlanır.
59
Veri Tabanına Bağlanma
60
İçeriği Güncelleme
İçeriği Güncelleme
Şu anda veri tabanı bağlamında çok bir değişiklik yok
Data/ApplicationDbContext.cs
61
İçeriği Güncelleme
public ApplicationDbContext(DbContextOptions<Applica
tionDbContext> options)
: base(options)
{
}
// ...
söylüyorsunuz.
62
İçeriği Güncelleme
63
Göç Oluşturma
Migration(Göç) Oluşturma
Migration(Göç) veri tabanı yapısındaki değişklikleri
tutmaya yarar. Böylece veri tabanı üzerinde geriye
dönüç(roll back) veya aynı yapıya sahip ikinci bir veri
tabanı yapmak mümkündür. Böylece değişen her kolon'u
takip edebilmek mümkündür.
64
Göç Oluşturma
Data/Migrations/<date>_AddItems.cs
migrationBuilder.CreateTable(
name: "Items",
columns: table => new
65
Göç Oluşturma
{
Id = table.Column<Guid>(type: "BLOB", nu
llable: false),
DueAt = table.Column<DateTimeOffset>(typ
e: "TEXT", nullable: true),
IsDone = table.Column<bool>(type: "INTEG
ER", nullable: false),
Title = table.Column<string>(type: "TEXT"
, nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Items", x => x.Id);
});
// (some code...)
}
migrationBuilder.DropTable(
name: "Items");
// (some code...)
}
66
Göç Oluşturma
Up metodundaki migrationBuilder.AddForeignKey
olarak değiştirin.
Eğer MySQL veya SQL Server gibi tam teşekküllü bir SQL
veri tabanı kullanıyor olsaydınız böyle bir değişikliğe
ihtiyacınız olmayacaktı. Göç dosyasını çalıştırdığınızda
hiç bir sorun almayacaktınız.
Göçü uygulayın
Göçü oluşturduktan sonraki son basamak uygulanmasıdır
:
67
Göç Oluşturma
68
Yeni Servis Sınıfı Oluşturma
Services/TodoItemService.cs
69
Yeni Servis Sınıfı Oluşturma
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AspNetCoreTodo.Data;
using AspNetCoreTodo.Models;
using Microsoft.EntityFrameworkCore;
namespace AspNetCoreTodo.Services
{
public class TodoItemService : ITodoItemService
{
private readonly ApplicationDbContext _conte
xt;
public TodoItemService(ApplicationDbContext
context)
{
_context = context;
}
return items;
}
}
}
70
Yeni Servis Sınıfı Oluşturma
NoSQL sorgusudur.
71
Yeni Servis Sınıfı Oluşturma
services.AddScoped<ITodoItemService, TodoItemService
>();
72
Yeni Servis Sınıfı Oluşturma
Test
Uygulamayı tekrar çalıştırın ve
http://localhost:5000/todo 'a gidin. Sahte verilerin
73
Yeni Özellikler Ekleme
74
Yeni Yapılacak Maddesi Ekleme
75
Yeni Yapılacak Maddesi Ekleme
ekleyiniz.
<div class="add-item-form">
<form>
<div id="add-item-error" class="text-danger">
</div>
<label for="add-item-title">Add a new item:</
label>
<input id="add-item-title">
<button type="button" id="add-item-button">A
dd</button>
</form>
</div>
ekleyin.
76
Yeni Yapılacak Maddesi Ekleme
$(document).ready(function() {
});
ekleyiniz.
function addItem() {
$('#add-item-error').hide();
var newTitle = $('#add-item-title').val();
77
Yeni Yapılacak Maddesi Ekleme
Aksiyon Ekleme
Şu anda yukarıdaki Javascript kodu çalışmayacak çünkü
/Todo/AddItem yolunda henüz bu talebi karşılacak bir
aksiyon oluşturun.
78
Yeni Yapılacak Maddesi Ekleme
return Ok();
}
Models/NewTodoItem.cs
79
Yeni Yapılacak Maddesi Ekleme
using System;
using System.ComponentModel.DataAnnotations;
namespace AspNetCoreTodo.Models
{
public class NewTodoItem
{
[Required]
public string Title { get; set; }
}
}
80
Yeni Yapılacak Maddesi Ekleme
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
81
Yeni Yapılacak Maddesi Ekleme
82
Yeni Yapılacak Maddesi Ekleme
_context.Items.Add(entity);
83
Yeni Yapılacak Maddesi Ekleme
Test Edin
Uygulamayı çalıştırın ve birkaç yeni yapılacak ekleyin.
Girdiğiniz değerler veri tabanına kaydedildiğinden sayfa
tekrardan yüklense de, tarayıcınızı kapatıp açsanız da
verilerin aynı kaldığını göreceksiniz.
84
Maddeleri Onay Kutusu ile Tamamlama
85
Maddeleri Onay Kutusu ile Tamamlama
geri gönderilir.
HTML kodu güncellenir.
wwwroot/js/site.js
$(document).ready(function() {
// ...
});
86
Maddeleri Onay Kutusu ile Tamamlama
function markCompleted(checkbox) {
checkbox.disabled = true;
POST http://localhost:5000/Todo/MarkDone
Content-Type: application/x-www-form-urlencoded
id=<some guid>
87
Maddeleri Onay Kutusu ile Tamamlama
return Ok();
}
88
Maddeleri Onay Kutusu ile Tamamlama
89
Maddeleri Onay Kutusu ile Tamamlama
Services/ITodoItemService.cs
item.IsDone = true;
90
Maddeleri Onay Kutusu ile Tamamlama
item.IsDone = true;
Test
Uygulamayı çalıştırıp bazı onay kutularını işaretleyin.
Sayfayı yenilediğinizde bu maddelerin yapılacaklar
listesinden silindiğini göreceksiniz. Bunun nedeni
GetIncompleteItemsAsync te bulunan Where filtresidir.
91
Maddeleri Onay Kutusu ile Tamamlama
92
Güvenlik ve Kimlik
Güvenlik ve Kimlik
Çoğu modern ağ uygulamasında veya Uygulama
Program Arayüzü(API) üzerinde en önemli endişelerden
biri güvenliktir. Uygulamanızı saldırılara karşı korumanız
ve kullanıcıların girdikleri bilgileri güvende tutmanız çok
önemlidir. Bu güvenli önemleri şu şekilde sıralanabilir.
93
Güvenlik ve Kimlik
94
Güvenlik ve Kimlik
95
Facebook Girişi Ekleme
96
Facebook Girişi Ekleme
http://localhost:5000/signin-facebook
97
Facebook Girişi Ekleme
yapıştırın
services
.AddAuthentication()
.AddFacebook(options =>
{
options.AppId = Configuration["Facebook:AppI
d"];
options.AppSecret = Configuration["Facebook:
AppSecret"];
});
98
Facebook Girişi Ekleme
gelir.
99
Facebook Girişi Ekleme
100
Kimlik Kontrolü
Kimlik Doğrulama
Çoğu uygulamada kullanıcı girişi mevcuttur. Kullanıcı giriş
yaparak kendine ait bölümleri gezebilir veya işlem
yapabilir. Ana sayfayı herkese göstermek mantıklı olabilir,
fakat yapılacaklar listesini sadece giriş yapmış olan
kişilerin görmesi gerekmekte.
[Authorize]
public class TodoController : Controller
{
// ...
}
using Microsoft.AspNetCore.Authorization;
101
Kimlik Kontrolü
102
Uygulama İçerisinde Kimlik Kullanma
Controllers/TodoController.cs
103
Uygulama İçerisinde Kimlik Kullanma
[Authorize]
public class TodoController : Controller
{
private readonly ITodoItemService _todoItemServi
ce;
private readonly UserManager<ApplicationUser> _u
serManager;
// ...
}
using Microsoft.AspNetCore.Identity;
104
Uygulama İçerisinde Kimlik Kullanma
return View(model);
}
erişebilirsiniz.
105
Uygulama İçerisinde Kimlik Kullanma
Services/ITodoItemService.cs
// ...
}
106
Uygulama İçerisinde Kimlik Kullanma
107
Uygulama İçerisinde Kimlik Kullanma
Services/TodoItemService.cs
108
Uygulama İçerisinde Kimlik Kullanma
return Ok();
}
109
Uygulama İçerisinde Kimlik Kullanma
c(User);
if (currentUser == null) return Unauthorized();
return Ok();
}
110
Uygulama İçerisinde Kimlik Kullanma
// ...
}
// ...
}
111
Uygulama İçerisinde Kimlik Kullanma
112
Role Göre Yetkilendirme
Yönetici Ekleme
Önce aşağıdaki gibi bir kontrolör oluşturun
Controllers/ManageUsersController.cs
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using AspNetCoreTodo.Models;
using Microsoft.EntityFrameworkCore;
namespace AspNetCoreTodo.Controllers
{
[Authorize(Roles = "Administrator")]
public class ManageUsersController : Controller
{
private readonly UserManager<ApplicationUser
113
Role Göre Yetkilendirme
> _userManager;
public ManageUsersController(UserManager<App
licationUser> userManager)
{
_userManager = userManager;
}
return View(model);
}
}
}
114
Role Göre Yetkilendirme
using System.Collections.Generic;
using AspNetCoreTodo.Models;
namespace AspNetCoreTodo
{
public class ManageUsersViewModel
{
public IEnumerable<ApplicationUser> Administ
rators { get; set; }
@model ManageUsersViewModel
@{
ViewData["Title"] = "Manage users";
}
<h2>@ViewData["Title"]</h2>
<h3>Administrators</h3>
<table class="table">
115
Role Göre Yetkilendirme
<thead>
<tr>
<td>Id</td>
<td>Email</td>
</tr>
</thead>
<h3>Everyone</h3>
<table class="table">
<thead>
<tr>
<td>Id</td>
<td>Email</td>
</tr>
</thead>
116
Role Göre Yetkilendirme
117
Role Göre Yetkilendirme
Startup.cs
if (env.IsDevelopment())
{
// (... some code)
118
Role Göre Yetkilendirme
if (alreadyExists) return;
namespace AspNetCoreTodo
{
public static class Constants
{
public const string AdministratorRole = "Adm
inistrator";
}
}
119
Role Göre Yetkilendirme
Startup.cs
120
Role Göre Yetkilendirme
121
Role Göre Yetkilendirme
Views/Shared/_AdminActionsPartial.cshtml
122
Role Göre Yetkilendirme
@using Microsoft.AspNetCore.Identity
@using AspNetCoreTodo.Models
@if (SignInManager.IsSignedIn(User))
{
var currentUser = await UserManager.GetUserAsync
(User);
if (isAdmin) {
<ul class="nav navbar-nav navbar-right">
<li><a asp-controller="ManageUsers" asp-
action="Index">Manage Users</a></li>
</ul>
}
}
123
Role Göre Yetkilendirme
124
Role Göre Yetkilendirme
Özet
ASP.NET Core Kimlik oldukça güçlü bir güvenlik ve kimlik
sistemidir. Bu sistem ile kimlik doğrulaması ve izin
kontrolleri yapabilir. Buna harici kimlik servis
sağlayıcılar(facebook, google, twitter) ekleyebilirsiniz.
dotnet new şablonu size kullanıcı girişi ve kayıdı gibi
125
Otomatik Test
Otomatik Test
Test uygulama yazmanın vazgeçilmez unsurlarından
biridir. Test yazmak problemlerden sakınmanızı sağlar
ayrıca ileride kodlarınızı düzenlediğinizde veya yeni
eklentiler yaptığında eski yaptıklarınızı etkileyip
etkilemediğini kontrol edebilisiniz.
126
Unit Testi
Unit Testi
Unit testi tek metodun veya kısa bir mantıksal akışı test
etmek için kullanılır. Sistemin tamamını test etmek yerine,
unit testi sahte veriler kullanarak gerçek metodun
yapması gereken işi doğru yapıp yapmadığını test eder.
127
Unit Testi
Test için genelde ayrı bir proje oluşturulur. Yeni test projesi
eskiden oluşturduğunuz ana projenin yanına ( içine değil)
oluşturulur.
mkdir AspNetCoreTodo.UnitTests
cd AspNetCoreTodo.UnitTests
dotnet new xunit
AspNetCoreTodo/
AspNetCoreTodo/
AspNetCoreTodo.csproj
Controllers/
(etc...)
AspNetCoreTodo.UnitTests/
AspNetCoreTodo.UnitTests.csproj
128
Unit Testi
mantığına bakın:
129
Unit Testi
_context.Items.Add(entity);
130
Unit Testi
131
Unit Testi
using System.Threading.Tasks;
using AspNetCoreTodo.Data;
using AspNetCoreTodo.Models;
using AspNetCoreTodo.Services;
using Microsoft.EntityFrameworkCore;
using Xunit;
namespace AspNetCoreTodo.UnitTests
{
public class TodoItemServiceShould
{
[Fact]
public async Task AddNewItem()
{
// ...
}
}
}
132
Unit Testi
133
Unit Testi
134
Unit Testi
135
Unit Testi
AspNetCoreTodo.UnitTests/TodoItemServiceShould.cs
136
Unit Testi
irstAsync();
Assert.Equal("Testing?", item.Title);
Assert.Equal(false, item.IsDone);
Assert.True(DateTimeOffset.Now.AddDays(3
) - item.DueAt < TimeSpan.FromSeconds(1));
}
}
}
Testi çalıştırma
Terminalde ( şu anda AspNetCoreTodo.UnitTests
klasöründe olduğunuzu varsayarak) aşağıdaki kodu
çalıştırın.
dotnet test
137
Unit Testi
dönsün.
MarkDoneAsync eğer gerçekten var olan bir maddeyi
138
Integration Testi
Entegrasyon Testi
Unit teste nazaran entegrasyon testi yönlendirme,
kontrolörler, servisler ve veri tabanlarının tamamını test
etmeyi amaçlar. Bir sınıfı izole etmek yerine tüm
komponentler düzgün bir şekilde senkronize çalışıyor mu
bunun kontrol edilmesini sağlar.
139
Integration Testi
mkdir AspNetCoreTodo.IntegrationTests
cd AspNetCoreTodo.IntegrationTests
dotnet new xunit
AspNetCoreTodo/
AspNetCoreTodo/
AspNetCoreTodo.csproj
Controllers/
(etc...)
AspNetCoreTodo.UnitTests/
AspNetCoreTodo.UnitTests.csproj
AspNetCoreTodo.IntegrationTests/
AspNetCoreTodo.IntegrationTests.csproj
140
Integration Testi
AspNetCoreTodo.IntegrationTests/TestFixture.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.Configuration;
141
Integration Testi
namespace AspNetCoreTodo.IntegrationTests
{
public class TestFixture : IDisposable
{
private readonly TestServer _server;
public TestFixture()
{
var builder = new WebHostBuilder()
.UseStartup<AspNetCoreTodo.Startup>(
)
.ConfigureAppConfiguration((context,
configBuilder) =>
{
configBuilder.SetBasePath(Path.C
ombine(
Directory.GetCurrentDirector
y(), "..\\..\\..\\..\\AspNetCoreTodo"));
configBuilder.AddJsonFile("appse
ttings.json");
142
Integration Testi
Client = _server.CreateClient();
Client.BaseAddress = new Uri("http://loc
alhost:5000");
}
AspNetCoreTodo.IntegrationTests/TodoRouteShould.cs
143
Integration Testi
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Xunit;
namespace AspNetCoreTodo.IntegrationTests
{
public class TodoRouteShould : IClassFixture<Tes
tFixture>
{
private readonly HttpClient _client;
[Fact]
public async Task ChallengeAnonymousUser()
{
// Ayarla
var request = new HttpRequestMessage(Htt
pMethod.Get, "/todo");
// Cagir
var response = await _client.SendAsync(r
equest);
// kontrol et
Assert.Equal(HttpStatusCode.Redirect, re
sponse.StatusCode);
Assert.Equal("http://localhost:5000/Acco
unt/Login?ReturnUrl=%2Ftodo",
response.Headers.Location.To
144
Integration Testi
String());
}
}
}
145
Integration Testi
Özet
Test çok geniş bir alan ve öğrenilecek çok şey var.
Örneğin bu bölümde Ön-yüz tesine hiç girmedik, bu
konuyu tek başına kitap olacak kadar geniştir. Fakat testin
nasıl yapılması gerektiğine dair bir fikriniz var. Bunun için
kendinizi geliştirebilir ve daha fazla örnek yapabilirsiniz.
146
Uygulamanın Dağıtılması
Uygulamanın Dağıtılması
Uzun bir yol geldiniz, fakat henüz tam anlamıyla bitti
diyemeyiz. Artık bu harika uygulamanızı yaptığınıza göre
dünya ile paylaşma zamanı geldi demektir.
Dağıtma Yöntemleri
ASP.NET Core uygulamaları genel olarak aşağıdaki
ortamlardan birisine kurulur.
147
Uygulamanın Dağıtılması
148
Uygulamanın Dağıtılması
149
Azure'a Dağıtma
Azure'a Dağıtma
ASP.NET uygulamasının Azure'a dağıtılması sadece bir
kaç adımdan oluşur. Bu işlem Azure web ortamından
yapılacağı gibi, komut satırı üzerinden de yapılabilir. Bunu
daha sonra göreceksiniz.
Ne yapmalıyız
Komut satırından ( git --version kullanarak git'in
kurulu olup olmadığını kontrol ediniz.)
150
Azure'a Dağıtma
[config]
project = AspNetCoreTodo/AspNetCoreTodo.csproj
.deployment
AspNetCoreTodo
AspNetCoreTodo.IntegrationTests
AspNetCoreTodo.UnitTests
az login
151
Azure'a Dağıtma
152
Azure'a Dağıtma
git init
git add .
git commit -m "First commit!"
153
Azure'a Dağıtma
https://nate@mytodoapp.scm.azurewebsites.net/MyTodoA
pp.git
154
Azure'a Dağıtma
155
Docker ile Dağıtma
docker --version
156
Docker ile Dağıtma
FROM microsoft/dotnet:latest
157
Docker ile Dağıtma
COPY . /app
WORKDIR /app
EXPOSE 5000/tcp
158
Docker ile Dağıtma
ayarlamanız lazım
Dockerfile
FROM microsoft/dotnet:latest
COPY . /app
WORKDIR /app
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
ENV ASPNETCORE_URLS http://*:5000
ENTRYPOINT ["dotnet", "run"]
İmaj Oluşturma
159
Docker ile Dağıtma
çalıştırılacağını söyler.
Nginx'in kurulması
Bu bölümün başında reverse proxy ile Nginx veya apache
kullanarak Kerstel'e gelen talepleri reverse proxy
yapmamız gerektiğini söylemiştim.
160
Docker ile Dağıtma
mkdir nginx
nginx/Dockerfile
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
nginx/nginx.conf
161
Docker ile Dağıtma
http {
server {
listen 80;
location / {
proxy_pass http://kestrel:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgra
de;
proxy_set_header Connection 'keep-al
ive';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
}
göreceksiniz.)
162
Docker ile Dağıtma
nginx:
build: ./nginx
links:
- kestrel:kestrel
ports:
- "80:80"
kestrel:
build: .
ports:
- "5000"
docker-compose up
163
Docker ile Dağıtma
164
Sonuç
Sonuç
Öncelikle ASP.NET Core el kitabını bitirdiğiniz için
teşekkürler. Üzerinden geçilmesi gereken ve bu kitaba
sığmayacak daha çok başlık var. Bunlardan bazıları şu
şekilde;
165
Sonuç
Yazar Hakkında
Merhaba, Ben Nate. Bu kitabı bir haftasonunda .NET
topluluğuna yardımcı olmak için yazdım. Umarım birşeyler
öğrenebilmişsinizdir.
Çevirmen Hakkında
166
Sonuç
Teşekkür
Bana İngilizceyi öğrenmemde ve bunu kullanabileceğim
yerlere gelmemde yardımı olan öğretmenlerime
teşekkürlerimi sunarım.
167