XoX Blog – Monolithic Architecture

Merhaba arkadaşlar bu projede ilk projenizi ilk db işlemlerinizi ve monolitik olarak tüm süreci yönettiğimiz zamanları hatırlamanızı istiyorum. Piyasada yapılan ‘ajas’ işlerinde genelde kullanılan yapı budur. Maksat en kısa sürede maksimum kullanılabilir uygulama (singlepage, kurumsal site vb.) tamamlamak ve yayına almaktır.

Her ne kadar kullanılması mini uygulamalarda mantıklı gibi gelsede işin aslı “sana bu işçilik bile fazla” mottosuyla projeler hazırlanıyor. Her yazılımcının iç sesi der ki: verileri şu db den alayım, loglamayı şu ek servisle yapalım, Cloud üzerinde server kuralım orada host edelim, güvenliği için sanal bir firewall yapılandıralım falan…. Neyse biraz projeyi anlatalım.

Proje, db üzerinde 3 tablo ile çalışan, CRUD işlemleri yapabileceğimiz, seo uyumlu url yapısına sahip monolitik bir .net MVC çalışmasıdır. Bu proje ile : db revizesi yapıp istediğiniz web sitesine entegresini yapabilirsiniz ve panel alanlarını referans alarak CMS panelini yapabilirsiniz.

Veri Tabanı Oluşturma

Ben bu aşamada host üzerindeki phpmyadmin alanını kullanarak db yi oluşturdum siz de aşağıdaki bağlantıdan .sql dosyasını import edip db yi oluşturabilirsiniz.

Soldan db adına tıkla > import> dosya seç > go

SQL DOSYASI EKLENECEK.

VSCode ile proje oluşturma

Bir MVC proje oluşturalım.

dotnet new mvc -n XoXBlogMono

İlk aşamada kurulumun başarılı olduğunu kontrol etmek için ‘cd XoXBlogMono’ diyelim ve dizine gidip
‘dotnet run ‘ ile projeyi çalıştıralım.

Proje http://localhost:5229 üzerinde çalışıyor, tasarım olarak mevcut tasarımı kullanacağız ve bootstrap ile destekleyeceğiz.

Bağımlılık Ekleyelim

Projede .cshtml dosyaları üzerinde sürekli değişiklik yapacağız, projeyi yeniden başlatmamak adına aşağıdaki kodu terminalde çalıştırarak paketi yükleyelim.

dotnet add package Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 

Program.cs üzerinde aşağıdaki değişikliğide yapmanız gerekiyor.

builder.Services.AddControllersWithViews().AddRazorRuntimeCompilation();

MySQL

MySQL veya MSSQL farketmez bir connector kullanmamız lazım, ben mysql tercih ettim.Aşağıdaki paketi kuralım.
*Kendi versiyonunuza göre ayar yaparsınız.

dotnet add package Pomelo.EntityFrameworkCore.MySql --version 8.0.0
dotnet add package Microsoft.EntityFrameworkCore.Design  --version 8.0.0

Veri Tabanı

Bu tarz hızlı ‘şip şak’ işlerde Scaffold kullanmak süper oluyor. Veri Tabanını tarayarak tüm entitiesleri oluşturuyor. Mükemmel… 🙂

dotnet ef dbcontext scaffold "Server=localhost;User=dbkullanici;Password=sifre;Database=veritabaniadi" Pomelo.EntityFrameworkCore.MySql -o DBModels -f

Yukarıdaki kodda, standart sunucu bağlantı bilgilerine ek olarak Pomelo.EntityFrameworkCore.MySql paketi var. Bu veritabanı mysql üzerinde olduğu için böyle. Siz mssql db ile işlem yapacaksanız
Microsoft.EntityFrameworkCore.SqlServer kullanacaksınız.

“-o DBModels” oluşacak entitylerin hangi klasör altında olacağını belirliyor. “-f” de eğer birden çok scaffold işlemi yaparsam üzerine yazsın beni uğraştırmasın demek.

Veri tabanı nesnelerim oluştu ve kullanılmaya hazır. YasinkaNarchContext ile tüm CRUD işlemleri yapabiliriz.

Controller Yapılandırması – Route – Verinin hazırlanması

Bu aşamada url patternimizi oluşturmanız gerekiyor. Ben genelde /kategori-adi-5 gibi bir yapı kullanırım.

Asıl ihtiyaç olan kategoriye ulaşmak veya bloğa ulaşmak olduğu için diğer değişkenlerin bir önemi yok. Id alanı işimizi görür ama siz isterseniz ek bir kontrol için categoryName ve blogTitle alanlarını sorguya dahil edebilirsiniz.

Sayfa verilerini taşımak için genel bir model oluştırdum. Models > GeneralModel.cs . İçerisine her entity IList tipinden objelerini ekledim.

HomeController üzerinde veritabanı bağlantısı yapıp verileri aldık ve view a gönderdik.

using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using XoXBlogMono.Models;
using XoXBlogMono.DBModels;
using Microsoft.EntityFrameworkCore;


namespace XoXBlogMono.Controllers;

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    private readonly YasinkaNarchContext _context;
    public HomeController(ILogger<HomeController> logger, YasinkaNarchContext context)
    {
        _logger = logger;
        _context = context;
    }

    public IActionResult Index()
    {
        GeneralModel generalModel = new GeneralModel();
        generalModel.Categories = _context.Categories.ToList();
        generalModel.Posts = _context.Posts.Include(p => p.Category).Include(p => p.Owner).OrderByDescending(p => p.CreatedAt).ToList();

        return View(generalModel);
    }

    [Route("category/{categoryName}-{categoryId}")]
    public IActionResult Category(string categoryName, int categoryId)
    {

        GeneralModel generalModel = new GeneralModel();
        generalModel.Category = _context.Categories.FirstOrDefault(c => c.Id == categoryId);

        if (generalModel.Category == null)
            return RedirectToAction("Index", "Home");

        generalModel.Categories = _context.Categories.ToList();
        generalModel.Posts = _context.Posts.Include(p => p.Owner).Where(p => p.CategoryId == categoryId).ToList();
        return View(generalModel);
    }
    [Route("category/{categoryName}/{blogTitle}-{blogId}")]
    public IActionResult Blog(string categoryName, string blogTitle, int blogId)
    {

        GeneralModel generalModel = new GeneralModel();
        generalModel.Categories = _context.Categories.ToList();
        generalModel.Post = _context.Posts.Include(p => p.Category).Include(p => p.Owner).FirstOrDefault(p => p.Id == blogId);
        if (generalModel.Post == null)
         return RedirectToAction("Index", "Home");

        return View(generalModel);

    }

}

Veriyle beslenen Viewler de böyle gözükmekte.

Url yapısı

domain.com/category
domain.com/category/yapay-zeka-1
domain.com/category/entity-framework-3/neden-csharp-2-2

Panel Güvenlik

CRUD işlemleri için hızlıca bir login page hazırladım ve panel kısmında doğrulamayı sağlamak için Session kulandım. Bu işlemide controller genelini bir attribute middleware i ile sarmaladık.

CRUD İşlemleri

Basit olması açısından View üzerinden Ajax ile gelen verilerin key değerlerini Model içindeki Propertylerle aynı isimde yaptım. Otomatik Maplanmış oldu.

Read

Create

Update

Delete

Diyelim ki, kayıt esnasında bazı alanları eksik göndereceğim ve bunları controller içinde toparlayıp CRUD işlemini öyle yapacağım. Bu durumda ModelState.IsValid size hata mesajı döndürecek ve
Model kontrolünü manuel yapmamız gerekecektir. Posts için yaptığımız CRUD işleminde aşağıdaki gibi yapılmıştır.

Sonuç olarak dinamik bir blog sitemiz olmuş oldu.Dar zamanda, herhangi bir pattern kaygısı olmadan yapabileceğiniz n adet web sitesi için yapıyı bu kurabilirsiniz. Artı olarak Türkiyede kabul görmüş N*tro, T*rhost, G*zelH*sting gibi firmaların Windows Hostinglerinde rahatlıkla deploy edebilirsiniz.

Github Url : https://github.com/yasinkaraman999/XoXBlog-Monolithic-Architecture

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir