Developer TurkeyBlog

Bir Node.js Geliştiricisinin Gözünden .NET Core'a Geçiş

Ben Enes Şahin, 2022'den beri Node.js ve Express ile backend geliştiriyorum. Bu yıl C# ve .NET Core öğrenmeye başladım; piyasada .NET talebinin Türkiye'de ne kadar yaygın olduğunu görünce bu tarafa ağırlık vermeye karar verdim. Bu yazıda henüz bu yolun başındayken, Node.js'ten gelen birinin gözünden iki ekosistemin nerede benzeştiğini ve nerede ayrıldığını anlatıyorum. Bir karşılaştırma rehberi değil, bir öğrenme notu.

Tanıdık gelen: katmanlı mimari

Node/Express'te route → controller → service → repository gibi bir katman ayrımını elle kuruyorsun, bu bir kütüphane değil, bir alışkanlık. ASP.NET Core'da bu ayrım Controller-Service-Repository olarak dile daha yerleşik geliyor, ama mantık aynı: HTTP isteğini karşılayan katman, iş kuralını yürüten katman ve veritabanına konuşan katman birbirinden ayrı.

Controllers/OrdersController.cs
[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
    private readonly IOrderService _orderService;
 
    public OrdersController(IOrderService orderService)
    {
        _orderService = orderService;
    }
 
    [HttpGet("{id}")]
    public async Task<IActionResult> GetOrder(string id)
    {
        var order = await _orderService.GetByIdAsync(id);
        return order is null ? NotFound() : Ok(order);
    }
}

Express'teki bir route handler'la neredeyse birebir aynı şekilde okunuyor: bir istek geliyor, bir servise devrediliyor, bir yanıt dönüyor.

Farklı gelen: dependency injection baştan var

Node'da dependency injection istersen kendi elinle kuruyorsun (ya da hiç kurmuyorsun, require ile doğrudan import ediyorsun). ASP.NET Core'da DI framework'ün bir parçası; yukarıdaki OrdersController örneğinde IOrderService'i constructor'a yazman yeterli, hangi somut sınıfın enjekte edileceğini Program.cs'te bir kere tanımlıyorsun:

Program.cs
builder.Services.AddScoped<IOrderService, OrderService>();

Bunun faydası testte ortaya çıkıyor: OrderService'i test ederken gerçek bir repository yerine sahte (mock) bir tane verebiliyorsun, kontrolörün kendisi değişmiyor. Node'da aynı şeyi yapmak için ya bir DI kütüphanesi (Awilix, InversifyJS gibi) kurman ya da kendi enjeksiyon mekanizmanı yazman gerekiyor.

Farklı gelen: derleme zamanı hataları

TypeScript kullanılsa bile Node'da bazı hatalar sadece çalışma zamanında (runtime) ortaya çıkıyor, özellikle any tipiyle gevşetilmiş yerlerde. C#'ta tip sistemi daha katı ve derleme zamanında (compile time) çok daha fazla şeyi yakalıyor: yanlış tipte bir parametre, null olabilecek bir referansı kontrol etmeden kullanmak gibi hatalar kod çalışmadan önce derleyicide patlıyor. Derleyicinin yakaladığı her hata, production'a hiç ulaşmayan bir hata demek.

Tanıdık gelen: ORM mantığı

Prisma ile Entity Framework Core arasında kavramsal fark yok: ikisi de modeli kod tarafında tanımlıyor, ikisi de migration üretiyor, ikisi de ilişkili veriyi include/Include ile tek sorguda getiriyor.

Data/Order.cs
public class Order
{
    public string Id { get; set; } = default!;
    public string UserId { get; set; } = default!;
    public User User { get; set; } = default!;
    public List<OrderItem> Items { get; set; } = new();
}

Prisma'daki schema.prisma dosyasının yaptığını burada C# sınıfları üstündeki öznitelikler (attribute) ve DbContext yapılandırması yapıyor. Syntax farklı, çözdüğü problem aynı.

Henüz netleşmeyen: hangi işlerde .NET tercih ediliyor

Bu kısımda dürüst olmak istiyorum: henüz bu yolun başındayım, Commencis'in ücretsiz mentorluklu bootcamp'ine katılıyorum ve gerçek bir .NET projesini üretime çıkarmadım. Node.js tarafında dört yılı aşkın üretim deneyimim var, .NET tarafında ise henüz başındayım. Bu yazıda "hangisi daha iyi" gibi bir sonuca varmıyorum çünkü böyle bir karşılaştırma yapacak deneyimim yok; sadece iki ekosistemin nerede benzeştiğini ve nerede ayrıldığını, öğrenirken gördüğüm kadarıyla anlatıyorum.

Sonuç

Node'dan .NET Core'a geçerken katmanlı mimari ve ORM mantığı tanıdık, dependency injection ve daha katı tip sistemi ise farklı bir çalışma şekli getiriyor. Öğrendikçe bu yazıyı kendi gerçek deneyimimle güncelleyeceğim.

Sık sorulan sorular

Node.js bilen biri için .NET Core'a geçiş zor mu?

Katmanlı mimari ve ORM mantığı tanıdık gelir; dependency injection ve daha katı tip sistemi ise farklı bir çalışma şekli getirir. Bu yazı bir öğrenme notudur, kesin bir zorluk derecesi vermez.

ASP.NET Core'da dependency injection nasıl çalışır?

Dependency injection framework'ün bir parçasıdır. Controller'ın constructor'ına arayüzü (örneğin IOrderService) yazarsın, hangi sınıfın enjekte edileceğini Program.cs içinde builder.Services.AddScoped ile bir kere tanımlarsın.

Prisma ile Entity Framework Core arasındaki fark nedir?

Kavramsal olarak aynı işi yaparlar: modeli kodda tanımlar, migration üretir ve ilişkili veriyi tek sorguda getirirler. Fark sözdizimindedir; Prisma bir schema.prisma dosyası kullanırken EF Core C# sınıflarını ve DbContext yapılandırmasını kullanır.

C# ile TypeScript'in tip sistemi arasındaki fark nedir?

TypeScript'te any gibi gevşetmeler bazı hataların çalışma zamanına kalmasına neden olabilir. C# daha katıdır ve yanlış tipli parametre ya da null kontrolü yapılmamış referans gibi hataları derleme zamanında yakalar.

Bu konuda takıldın mı, ya da ekibine geliştirici mi arıyorsun?

Yazıyla ilgili sorunu ya da iş teklifini bana yaz.

İletişime geç
Tüm yazılar