{"id":40279,"date":"2026-02-25T20:00:48","date_gmt":"2026-02-25T17:00:48","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/"},"modified":"2026-02-25T20:00:48","modified_gmt":"2026-02-25T17:00:48","slug":"smartorder-bolum-2-servis-katmani-mimarisi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/","title":{"rendered":"SmartOrder \u2014 B\u00f6l\u00fcm 2: Servis Katman\u0131 Mimarisi"},"content":{"rendered":"<h2>SmartOrder \u2014 B\u00f6l\u00fcm 2: Servis Katman\u0131 Mimarisi<\/h2>\n<p>\n    SmartOrder serimizin ikinci b\u00f6l\u00fcm\u00fcne ho\u015f geldiniz! \u0130lk b\u00f6l\u00fcmde sistemin genel mimarisine ve veri eri\u015fim katman\u0131na (DAL) odaklanm\u0131\u015ft\u0131k. Bu b\u00f6l\u00fcmde ise SmartOrder uygulamas\u0131n\u0131n kalbi olan Servis Katman\u0131 (Services Layer) mimarisini derinlemesine inceleyece\u011fiz. Servis katman\u0131, i\u015f mant\u0131\u011f\u0131n\u0131n merkezi oldu\u011fu, uygulaman\u0131n temel fonksiyonlar\u0131n\u0131 bar\u0131nd\u0131ran ve d\u0131\u015f d\u00fcnya ile etkile\u015fimi y\u00f6neten kritik bir katmand\u0131r. Bu katman\u0131n do\u011fru tasarlanmas\u0131, uygulaman\u0131n \u00f6l\u00e7eklenebilirli\u011fi, s\u00fcrd\u00fcr\u00fclebilirli\u011fi ve test edilebilirli\u011fi a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir.\n<\/p>\n<h2>Servis Katman\u0131 Nedir ve Neden \u00d6nemlidir?<\/h2>\n<p>\n    Servis katman\u0131, bir uygulaman\u0131n i\u015f kurallar\u0131n\u0131, s\u00fcre\u00e7lerini ve mant\u0131\u011f\u0131n\u0131 bar\u0131nd\u0131ran katmand\u0131r. Genellikle kullan\u0131c\u0131 aray\u00fcz\u00fc (UI) veya API katman\u0131 ile veri eri\u015fim katman\u0131 (DAL) aras\u0131nda k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. Bu katman, veritaban\u0131 i\u015flemlerini do\u011frudan yapmaz; bunun yerine veri eri\u015fim katman\u0131n\u0131 kullanarak veri manip\u00fclasyonu yapar ve bu verilere i\u015f mant\u0131\u011f\u0131n\u0131 uygular.\n<\/p>\n<h3>\u0130\u015f Mant\u0131\u011f\u0131n\u0131n Merkezi<\/h3>\n<p>\n    Servis katman\u0131, uygulaman\u0131n t\u00fcm \u00f6nemli i\u015f kurallar\u0131n\u0131 ve s\u00fcre\u00e7lerini tek bir yerde toplar. \u00d6rne\u011fin, bir sipari\u015fin olu\u015fturulmas\u0131, g\u00fcncellenmesi veya iptal edilmesi gibi t\u00fcm operasyonlar burada tan\u0131mlan\u0131r. Bu merkezile\u015fme, i\u015f mant\u0131\u011f\u0131n\u0131n tutarl\u0131 bir \u015fekilde uygulanmas\u0131n\u0131 sa\u011flar ve farkl\u0131 aray\u00fczlerden (web, mobil, API) gelen isteklerin ayn\u0131 kurallara tabi olmas\u0131n\u0131 garanti eder.\n<\/p>\n<h3>Soyutlama ve Ba\u011f\u0131ml\u0131l\u0131k Azaltma<\/h3>\n<p>\n    Bu katman, alt katmanlardaki (veri eri\u015fim katman\u0131 gibi) detaylar\u0131 \u00fcst katmanlardan (UI, API) soyutlar. \u00dcst katmanlar, verilerin nas\u0131l sakland\u0131\u011f\u0131 veya eri\u015fildi\u011fi hakk\u0131nda bilgi sahibi olmak zorunda kalmaz; sadece servis katman\u0131n\u0131n sundu\u011fu aray\u00fczleri kullanarak i\u015flevselli\u011fe eri\u015firler. Bu soyutlama, ba\u011f\u0131ml\u0131l\u0131klar\u0131 azalt\u0131r ve alt katmanlarda yap\u0131lan de\u011fi\u015fikliklerin \u00fcst katmanlar\u0131 do\u011frudan etkilemesini engeller.\n<\/p>\n<h3>Geli\u015ftirme S\u00fcre\u00e7lerine Katk\u0131s\u0131<\/h3>\n<p>\n    \u0130yi tasarlanm\u0131\u015f bir servis katman\u0131, paralel geli\u015ftirmeyi kolayla\u015ft\u0131r\u0131r. Bir ekip UI \u00fczerinde \u00e7al\u0131\u015f\u0131rken, ba\u015fka bir ekip servis katman\u0131ndaki i\u015f mant\u0131\u011f\u0131n\u0131 geli\u015ftirebilir. Ayr\u0131ca, i\u015f gereksinimleri de\u011fi\u015ftik\u00e7e, bu de\u011fi\u015fikliklerin \u00e7o\u011fu servis katman\u0131nda y\u00f6netilebilir, bu da di\u011fer katmanlarda minimum etki yarat\u0131r. Bu durum, uygulaman\u0131n adaptasyon yetene\u011fini art\u0131r\u0131r.\n<\/p>\n<h3>\u00d6rnek: Bir Sipari\u015f Olu\u015fturma S\u00fcreci<\/h3>\n<p>\n    SmartOrder&#8217;da bir sipari\u015f olu\u015fturma s\u00fcreci, servis katman\u0131n\u0131n kritik rol\u00fcn\u00fc a\u00e7\u0131k\u00e7a g\u00f6sterir:\n<\/p>\n<ol>\n<li>Kullan\u0131c\u0131, \u00fcr\u00fcnleri se\u00e7er ve sepetini onaylar.<\/li>\n<li>API katman\u0131, bu iste\u011fi <code>OrderService<\/code>&#8216;e iletir.<\/li>\n<li><code>OrderService<\/code>, \u00fcr\u00fcn stoklar\u0131n\u0131 kontrol eder (<code>ProductService<\/code> veya <code>StockService<\/code> arac\u0131l\u0131\u011f\u0131yla).<\/li>\n<li>M\u00fc\u015fteri bilgileri do\u011frulan\u0131r (<code>CustomerService<\/code> arac\u0131l\u0131\u011f\u0131yla).<\/li>\n<li>Sipari\u015fin ge\u00e7erlili\u011fi i\u00e7in i\u015f kurallar\u0131 uygulan\u0131r (minimum sipari\u015f tutar\u0131, kampanya ko\u015fullar\u0131 vb.).<\/li>\n<li>Ge\u00e7erliyse, sipari\u015f veritaban\u0131na kaydedilir (<code>OrderRepository<\/code> arac\u0131l\u0131\u011f\u0131yla).<\/li>\n<li>\u00d6deme i\u015flemi ba\u015flat\u0131l\u0131r (<code>PaymentService<\/code> arac\u0131l\u0131\u011f\u0131yla).<\/li>\n<li>Sipari\u015f durumu g\u00fcncellenir ve m\u00fc\u015fteriye bildirim g\u00f6nderilir.<\/li>\n<\/ol>\n<h2>SmartOrder Servis Katman\u0131n\u0131n Temel Prensipleri<\/h2>\n<p>\n    SmartOrder&#8217;\u0131n servis katman\u0131, modern yaz\u0131l\u0131m geli\u015ftirme prensiplerine uygun olarak tasarlanm\u0131\u015ft\u0131r. Bu prensipler, katman\u0131n sa\u011flam, esnek ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar.\n<\/p>\n<h3>Katmanl\u0131 Mimari Yakla\u015f\u0131m\u0131<\/h3>\n<p>\n    SmartOrder, geleneksel katmanl\u0131 mimariyi benimser. Bu yakla\u015f\u0131mda, her katman\u0131n belirli bir sorumlulu\u011fu vard\u0131r ve sadece kendi alt\u0131ndaki katmanla ileti\u015fim kurar. Servis katman\u0131, sunum katman\u0131ndan gelen istekleri al\u0131r ve veri eri\u015fim katman\u0131yla etkile\u015fime girerek i\u015f mant\u0131\u011f\u0131n\u0131 uygular. Bu net ayr\u0131m, karma\u015f\u0131kl\u0131\u011f\u0131 azalt\u0131r ve her katman\u0131n ba\u011f\u0131ms\u0131z olarak geli\u015ftirilmesine ve test edilmesine olanak tan\u0131r.\n<\/p>\n<h3>Sorumluluklar\u0131n Ayr\u0131lmas\u0131 (Separation of Concerns)<\/h3>\n<p>\n    Her servis s\u0131n\u0131f\u0131, belirli bir i\u015f alan\u0131na veya fonksiyona odaklan\u0131r. \u00d6rne\u011fin, <code>OrderService<\/code> sadece sipari\u015flerle ilgili i\u015flemleri y\u00f6netirken, <code>ProductService<\/code> \u00fcr\u00fcn y\u00f6netimiyle ilgilenir. Bu prensip, kodun daha okunabilir, bak\u0131m\u0131 daha kolay ve hatalara daha az a\u00e7\u0131k olmas\u0131n\u0131 sa\u011flar. Bir de\u011fi\u015fiklik yap\u0131lmas\u0131 gerekti\u011finde, yaln\u0131zca ilgili servisin etkilenmesi beklenir.\n<\/p>\n<h3>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection &#8211; DI)<\/h3>\n<p>\n    Servis katman\u0131, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunu yo\u011fun bir \u015fekilde kullan\u0131r. Servisler, ihtiya\u00e7 duyduklar\u0131 di\u011fer servisleri veya repository&#8217;leri do\u011frudan olu\u015fturmak yerine, constructor&#8217;lar\u0131 arac\u0131l\u0131\u011f\u0131yla d\u0131\u015far\u0131dan al\u0131rlar. Bu, servislerin daha gev\u015fek ba\u011fl\u0131 olmas\u0131n\u0131 (loosely coupled) sa\u011flar, test edilebilirli\u011fi art\u0131r\u0131r ve kodun esnekli\u011fini y\u00fckseltir. SmartOrder&#8217;da bu genellikle bir IoC (Inversion of Control) konteyneri (\u00f6rne\u011fin, .NET&#8217;in yerle\u015fik DI konteyneri veya Autofac gibi bir k\u00fct\u00fcphane) arac\u0131l\u0131\u011f\u0131yla y\u00f6netilir.\n<\/p>\n<pre><code class=\"language-csharp\">\npublic class OrderService : IOrderService\n{\n    private readonly IOrderRepository _orderRepository;\n    private readonly IProductService _productService;\n    private readonly IPaymentService _paymentService;\n\n    public OrderService(IOrderRepository orderRepository, IProductService productService, IPaymentService paymentService)\n    {\n        _orderRepository = orderRepository;\n        _productService = productService;\n        _paymentService = paymentService;\n    }\n\n    \/\/ ... servis metodlar\u0131 ...\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Tek Sorumluluk Prensibi (Single Responsibility Principle - SRP)<\/h3>\n<p>\n    Her servis veya servis metodu, yaln\u0131zca tek bir sorumlulu\u011fa sahip olmal\u0131d\u0131r. Bu, bir s\u0131n\u0131f\u0131n veya metodun de\u011fi\u015fmesi i\u00e7in yaln\u0131zca bir nedeni olmas\u0131 gerekti\u011fi anlam\u0131na gelir. \u00d6rne\u011fin, bir <code>OrderService<\/code>'in hem sipari\u015f olu\u015fturma hem de kullan\u0131c\u0131 yetkilendirme mant\u0131\u011f\u0131n\u0131 i\u00e7ermesi SRP'ye ayk\u0131r\u0131d\u0131r. Yetkilendirme ayr\u0131 bir <code>AuthorizationService<\/code> taraf\u0131ndan ele al\u0131nmal\u0131d\u0131r. Bu prensip, kodun anla\u015f\u0131labilirli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.\n<\/p>\n<h2>Servis Katman\u0131 Bile\u015fenleri<\/h2>\n<p>\n    SmartOrder'\u0131n servis katman\u0131, farkl\u0131 sorumluluklar\u0131 olan \u00e7e\u015fitli bile\u015fenlerden olu\u015fur. Bu bile\u015fenler, i\u015f mant\u0131\u011f\u0131n\u0131 d\u00fczenli ve y\u00f6netilebilir bir \u015fekilde uygulamak i\u00e7in birlikte \u00e7al\u0131\u015f\u0131r.\n<\/p>\n<h3>Uygulama Servisleri (Application Services)<\/h3>\n<p>\n    Uygulama servisleri, genellikle d\u0131\u015f d\u00fcnya ile (API veya UI katman\u0131) etkile\u015fime giren ve belirli bir i\u015f ak\u0131\u015f\u0131n\u0131 veya kullan\u0131m senaryosunu koordine eden s\u0131n\u0131flard\u0131r. Bunlar, birden fazla domain servisinin veya repository'nin orkestrasyonunu yaparak karma\u015f\u0131k i\u015f i\u015flemlerini y\u00f6netir. \u00d6rne\u011fin, <code>OrderAppService<\/code>, bir sipari\u015fin u\u00e7tan uca olu\u015fturulmas\u0131 s\u00fcrecini y\u00f6netebilir, bu s\u00fcre\u00e7te <code>ProductService<\/code>, <code>CustomerService<\/code> ve <code>PaymentService<\/code> gibi di\u011fer servisleri \u00e7a\u011f\u0131rabilir.\n<\/p>\n<h3>Domain Servisleri (Domain Services)<\/h3>\n<p>\n    Domain servisleri, tek bir domain varl\u0131\u011f\u0131na (\u00f6rne\u011fin, <code>Order<\/code> veya <code>Product<\/code>) ait olmayan, ancak birden fazla varl\u0131\u011f\u0131 veya genel bir i\u015f kural\u0131n\u0131 i\u00e7eren i\u015f mant\u0131\u011f\u0131n\u0131 bar\u0131nd\u0131r\u0131r. \u00d6rne\u011fin, bir \u00fcr\u00fcn\u00fcn stok durumuna g\u00f6re indirim uygulama kural\u0131, hem <code>Product<\/code> hem de <code>Discount<\/code> varl\u0131klar\u0131n\u0131 ilgilendirdi\u011fi i\u00e7in bir <code>PricingService<\/code> veya <code>DiscountService<\/code> i\u00e7inde yer alabilir. Bu servisler, genellikle uygulama servisleri taraf\u0131ndan \u00e7a\u011fr\u0131l\u0131r.\n<\/p>\n<h3>Veri Eri\u015fim Katman\u0131 (DAL) ile Etkile\u015fim<\/h3>\n<p>\n    Servis katman\u0131, do\u011frudan veritaban\u0131 i\u015flemleri yapmaz. Bunun yerine, veri eri\u015fim katman\u0131nda tan\u0131mlanm\u0131\u015f olan repository aray\u00fczlerini (\u00f6rne\u011fin, <code>IOrderRepository<\/code>, <code>IProductRepository<\/code>) kullan\u0131r. Bu aray\u00fczler arac\u0131l\u0131\u011f\u0131yla veri ekleme, g\u00fcncelleme, silme ve sorgulama i\u015flemleri ger\u00e7ekle\u015ftirilir. Bu ayr\u0131m, servis katman\u0131n\u0131 veritaban\u0131 teknolojisinden ba\u011f\u0131ms\u0131z hale getirir ve DAL'da yap\u0131lan de\u011fi\u015fikliklerin servis katman\u0131n\u0131 etkilemesini en aza indirir.\n<\/p>\n<pre><code class=\"language-csharp\">\npublic async Task<OrderDto> CreateOrderAsync(CreateOrderCommand command)\n{\n    \/\/ Validasyonlar burada veya ayr\u0131 bir validator'da yap\u0131l\u0131r.\n    if (command.OrderItems == null || !command.OrderItems.Any())\n    {\n        throw new BusinessException(\"Sipari\u015f \u00f6\u011feleri bo\u015f olamaz.\");\n    }\n\n    var order = new Order\n    {\n        CustomerId = command.CustomerId,\n        OrderDate = DateTime.UtcNow,\n        Status = OrderStatus.Pending,\n        \/\/ Di\u011fer \u00f6zellikler\n    };\n\n    foreach (var item in command.OrderItems)\n    {\n        var product = await _productService.GetProductByIdAsync(item.ProductId);\n        if (product == null || product.StockQuantity < item.Quantity)\n        {\n            throw new BusinessException($\"\u00dcr\u00fcn {item.ProductId} i\u00e7in yeterli stok yok.\");\n        }\n        order.AddOrderItem(new OrderItem { ProductId = item.ProductId, Quantity = item.Quantity, Price = product.Price });\n        await _productService.DecreaseStockAsync(item.ProductId, item.Quantity); \/\/ Stok g\u00fcncelleme\n    }\n\n    await _orderRepository.AddAsync(order);\n    await _orderRepository.UnitOfWork.CommitAsync(); \/\/ Transaction y\u00f6netimi\n\n    \/\/ \u00d6deme servisini \u00e7a\u011f\u0131r\n    await _paymentService.ProcessPaymentAsync(order.Id, order.TotalPrice);\n\n    return _mapper.Map<OrderDto>(order);\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Yard\u0131mc\u0131 S\u0131n\u0131flar ve Ara Katmanlar (Helper Classes and Middleware)<\/h3>\n<p>\n    Servis katman\u0131 i\u00e7inde, i\u015f mant\u0131\u011f\u0131na do\u011frudan hizmet eden ancak bir servisin ana sorumlulu\u011fu olmayan yard\u0131mc\u0131 s\u0131n\u0131flar (\u00f6rne\u011fin, tarih\/saat yard\u0131mc\u0131lar\u0131, formatlama yard\u0131mc\u0131lar\u0131) bulunabilir. Ayr\u0131ca, loglama, \u00f6nbellekleme veya yetkilendirme gibi \u00e7apraz kesen konular\u0131 ele almak i\u00e7in ara katmanlar (middleware) veya Aspect-Oriented Programming (AOP) yakla\u015f\u0131mlar\u0131 da kullan\u0131labilir. Bu, ana i\u015f mant\u0131\u011f\u0131n\u0131n temiz kalmas\u0131n\u0131 sa\u011flar.\n<\/p>\n<h2>\u0130\u015f Ak\u0131\u015flar\u0131 ve Senaryolar<\/h2>\n<p>\n    SmartOrder'\u0131n servis katman\u0131, uygulaman\u0131n temel i\u015f ak\u0131\u015flar\u0131n\u0131 ve kullan\u0131m senaryolar\u0131n\u0131 y\u00f6netmek \u00fczere tasarlanm\u0131\u015ft\u0131r. Her senaryo, belirli bir dizi ad\u0131mdan olu\u015fur ve bu ad\u0131mlar, farkl\u0131 servislerin ve repository'lerin koordinasyonunu gerektirir.\n<\/p>\n<h3>Sipari\u015f Olu\u015fturma Ak\u0131\u015f\u0131<\/h3>\n<p>\n    Daha \u00f6nce k\u0131saca bahsedilen sipari\u015f olu\u015fturma ak\u0131\u015f\u0131, servis katman\u0131n\u0131n en karma\u015f\u0131k senaryolar\u0131ndan biridir. Bu ak\u0131\u015f, kullan\u0131c\u0131dan gelen verilerin do\u011frulanmas\u0131, stok kontrol\u00fc, fiyatland\u0131rma, veritaban\u0131na kaydetme ve \u00f6deme i\u015flemlerini i\u00e7erir. Her ad\u0131mda olas\u0131 hatalar\u0131n y\u00f6netimi ve tutarl\u0131l\u0131\u011f\u0131n sa\u011flanmas\u0131 kritik \u00f6neme sahiptir.\n<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ Sipari\u015f Olu\u015fturma Ak\u0131\u015f\u0131 Pseudo-Kodu\npublic async Task<OrderDto> CreateOrder(CreateOrderRequest request)\n{\n    \/\/ 1. \u0130stek verilerini valide et (FluentValidation veya manuel)\n    ValidateOrderRequest(request);\n\n    \/\/ 2. M\u00fc\u015fteri bilgilerini kontrol et\n    var customer = await _customerService.GetCustomerById(request.CustomerId);\n    if (customer == null) throw new NotFoundException(\"M\u00fc\u015fteri bulunamad\u0131.\");\n\n    var order = Order.CreateNew(request.CustomerId);\n\n    foreach (var itemRequest in request.Items)\n    {\n        \/\/ 3. \u00dcr\u00fcn ve stok kontrol\u00fc\n        var product = await _productService.GetProductById(itemRequest.ProductId);\n        if (product == null) throw new NotFoundException($\"\u00dcr\u00fcn {itemRequest.ProductId} bulunamad\u0131.\");\n        if (product.StockQuantity < itemRequest.Quantity) throw new BusinessException($\"Yetersiz stok i\u00e7in {product.Name}.\");\n\n        order.AddOrderItem(product.Id, itemRequest.Quantity, product.Price);\n        await _productService.DecreaseStock(product.Id, itemRequest.Quantity); \/\/ Stok d\u00fc\u015f\u00fcrme\n    }\n\n    \/\/ 4. \u0130\u015f kurallar\u0131n\u0131 uygula (indirimler, minimum sipari\u015f tutar\u0131 vb.)\n    _discountService.ApplyDiscounts(order);\n\n    \/\/ 5. Sipari\u015fi kaydet (Transaction i\u00e7inde)\n    await _orderRepository.AddAsync(order);\n    await _orderRepository.UnitOfWork.CommitAsync(); \/\/ Veritaban\u0131 i\u015flemini onayla\n\n    \/\/ 6. \u00d6deme i\u015flemini ba\u015flat\n    var paymentResult = await _paymentService.ProcessPayment(order.Id, order.TotalPrice);\n    if (!paymentResult.IsSuccess)\n    {\n        \/\/ \u00d6deme ba\u015far\u0131s\u0131z olursa sipari\u015fi iptal et veya durumu g\u00fcncelle\n        order.Status = OrderStatus.PaymentFailed;\n        await _orderRepository.UpdateAsync(order);\n        await _orderRepository.UnitOfWork.CommitAsync();\n        throw new PaymentFailedException(\"\u00d6deme i\u015flemi ba\u015far\u0131s\u0131z oldu.\");\n    }\n\n    order.Status = OrderStatus.Confirmed;\n    await _orderRepository.UpdateAsync(order);\n    await _orderRepository.UnitOfWork.CommitAsync();\n\n    \/\/ 7. M\u00fc\u015fteriye bildirim g\u00f6nder\n    _notificationService.SendOrderConfirmationEmail(customer, order);\n\n    return _mapper.Map<OrderDto>(order);\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Sipari\u015f G\u00fcncelleme ve \u0130ptal<\/h3>\n<p>\n    Bir sipari\u015fin g\u00fcncellenmesi veya iptal edilmesi de karma\u015f\u0131k s\u00fcre\u00e7lerdir. \u00d6rne\u011fin, bir sipari\u015f iptal edildi\u011finde, stoklar\u0131n geri eklenmesi, \u00f6demenin iade edilmesi ve m\u00fc\u015fteriye bildirim g\u00f6nderilmesi gerekebilir. Bu i\u015flemlerin tamam\u0131, atomik bir \u015fekilde (ya hepsi ba\u015far\u0131l\u0131 olur ya da hi\u00e7biri) ger\u00e7ekle\u015ftirilmelidir.\n<\/p>\n<h3>Stok Y\u00f6netimi Entegrasyonu<\/h3>\n<p>\n    SmartOrder, stok y\u00f6netimi ile derinlemesine entegredir. Bir sipari\u015f olu\u015fturuldu\u011funda veya g\u00fcncellendi\u011finde, ilgili \u00fcr\u00fcnlerin stok miktarlar\u0131 otomatik olarak g\u00fcncellenir. Bu entegrasyon, tutars\u0131zl\u0131klar\u0131 \u00f6nlemek ve ger\u00e7ek zamanl\u0131 stok bilgilerini sa\u011flamak i\u00e7in hayati \u00f6neme sahiptir. <code>ProductService<\/code> veya \u00f6zel bir <code>StockService<\/code> bu entegrasyonu y\u00f6netir.\n<\/p>\n<h3>\u00d6deme \u0130\u015flemleri<\/h3>\n<p>\n    \u00d6deme i\u015flemleri, hassas ve harici sistemlerle etkile\u015fim gerektiren bir aland\u0131r. <code>PaymentService<\/code>, \u00f6deme a\u011f ge\u00e7itleri ile ileti\u015fim kurarak \u00f6deme alma, iade etme ve \u00f6deme durumlar\u0131n\u0131 g\u00fcncelleme gibi i\u015flemleri y\u00f6netir. Bu servis, g\u00fcvenlik ve hata y\u00f6netimi a\u00e7\u0131s\u0131ndan \u00f6zel dikkat gerektirir.\n<\/p>\n<h2>Hata Y\u00f6netimi ve Validasyon<\/h2>\n<p>\n    Sa\u011flam bir servis katman\u0131, kapsaml\u0131 hata y\u00f6netimi ve validasyon mekanizmalar\u0131na sahip olmal\u0131d\u0131r. Bu, uygulaman\u0131n beklenmedik durumlarla ba\u015fa \u00e7\u0131kabilmesini ve kullan\u0131c\u0131ya anlaml\u0131 geri bildirimler sunabilmesini sa\u011flar.\n<\/p>\n<h3>Giri\u015f Verisi Validasyonu<\/h3>\n<p>\n    Servis katman\u0131na gelen t\u00fcm giri\u015f verileri (DTO'lar, komutlar), i\u015flenmeden \u00f6nce valide edilmelidir. Bu validasyonlar, zorunlu alanlar\u0131n doldurulup doldurulmad\u0131\u011f\u0131, veri tiplerinin do\u011fru olup olmad\u0131\u011f\u0131 ve belirli formatlara uyulup uyulmad\u0131\u011f\u0131 gibi temel kontrolleri i\u00e7erir. FluentValidation gibi k\u00fct\u00fcphaneler bu s\u00fcre\u00e7te olduk\u00e7a faydal\u0131d\u0131r.\n<\/p>\n<h3>\u0130\u015f Kural\u0131 \u0130hlalleri<\/h3>\n<p>\n    Giri\u015f verisi ge\u00e7erli olsa bile, i\u015f kurallar\u0131na uymayabilir. \u00d6rne\u011fin, bir m\u00fc\u015fterinin kredi limiti a\u015f\u0131lm\u0131\u015f olabilir veya bir \u00fcr\u00fcn stokta olmayabilir. Bu t\u00fcr durumlar, \u00f6zel i\u015f istisnalar\u0131 (<code>BusinessException<\/code>) f\u0131rlat\u0131larak y\u00f6netilir ve bu istisnalar, \u00fcst katmanlarda yakalanarak kullan\u0131c\u0131ya uygun bir hata mesaj\u0131 olarak iletilir.\n<\/p>\n<h3>\u00d6zel \u0130stisnalar ve Hata Kodlar\u0131<\/h3>\n<p>\n    SmartOrder, farkl\u0131 hata t\u00fcrleri i\u00e7in \u00f6zel istisna s\u0131n\u0131flar\u0131 tan\u0131mlar (\u00f6rne\u011fin, <code>NotFoundException<\/code>, <code>BusinessException<\/code>, <code>PaymentFailedException<\/code>). Bu, hatalar\u0131n daha spesifik bir \u015fekilde yakalanmas\u0131n\u0131 ve i\u015flenmesini sa\u011flar. Ayr\u0131ca, hata kodlar\u0131 kullanarak istemciye daha detayl\u0131 bilgi verilebilir.\n<\/p>\n<pre><code class=\"language-csharp\">\npublic class BusinessException : Exception\n{\n    public string ErrorCode { get; }\n    public BusinessException(string message, string errorCode = null) : base(message)\n    {\n        ErrorCode = errorCode;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Merkezi Hata Yakalama<\/h3>\n<p>\n    Servis katman\u0131nda f\u0131rlat\u0131lan istisnalar, genellikle API katman\u0131nda merkezi bir hata yakalama mekanizmas\u0131 (\u00f6rne\u011fin, bir global exception handler middleware) taraf\u0131ndan yakalan\u0131r. Bu mekanizma, istisnalar\u0131 uygun HTTP durum kodlar\u0131na (400 Bad Request, 404 Not Found, 500 Internal Server Error) ve standartla\u015ft\u0131r\u0131lm\u0131\u015f hata yan\u0131tlar\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.\n<\/p>\n<h2>G\u00fcvenlik ve Yetkilendirme<\/h2>\n<p>\n    SmartOrder'\u0131n servis katman\u0131, uygulaman\u0131n g\u00fcvenli\u011fini sa\u011flamak ve yetkisiz eri\u015fimi engellemek i\u00e7in kritik bir rol oynar. \u0130\u015flemlerin yaln\u0131zca yetkili kullan\u0131c\u0131lar taraf\u0131ndan ve do\u011fru izinlerle ger\u00e7ekle\u015ftirildi\u011finden emin olunur.\n<\/p>\n<h3>Kimlik Do\u011frulama (Authentication)<\/h3>\n<p>\n    Servis katman\u0131, do\u011frudan kimlik do\u011frulama i\u015flemini yapmaz. Bu genellikle API veya sunum katman\u0131nda (\u00f6rne\u011fin, JWT token do\u011frulama) ger\u00e7ekle\u015ftirilir. Ancak, servis metotlar\u0131 \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, \u00e7a\u011fr\u0131y\u0131 yapan kullan\u0131c\u0131n\u0131n kimli\u011fi (\u00f6rne\u011fin, kullan\u0131c\u0131 ID'si) genellikle servis katman\u0131na iletilir.\n<\/p>\n<h3>Yetkilendirme Kontrolleri (Authorization Checks)<\/h3>\n<p>\n    Servis katman\u0131, belirli bir i\u015flemin ger\u00e7ekle\u015ftirilmesi i\u00e7in kullan\u0131c\u0131n\u0131n gerekli izinlere sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Bu kontroller, metodun ba\u015f\u0131nda veya daha genel bir \u015fekilde bir yetkilendirme filtresi (\u00f6rne\u011fin, .NET Core'daki <code>[Authorize]<\/code> attribute'lar\u0131 ve \u00f6zel policy'ler) arac\u0131l\u0131\u011f\u0131yla yap\u0131labilir. \u00d6rne\u011fin, sadece \"Admin\" rol\u00fcne sahip kullan\u0131c\u0131lar sipari\u015fleri iptal edebilirken, \"Customer\" rol\u00fcne sahip kullan\u0131c\u0131lar sadece kendi sipari\u015flerini g\u00f6r\u00fcnt\u00fcleyebilir.\n<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ \u00d6rnek bir yetkilendirme kontrol\u00fc\npublic async Task<bool> CancelOrderAsync(Guid orderId, Guid userId, UserRole userRole)\n{\n    var order = await _orderRepository.GetByIdAsync(orderId);\n    if (order == null)\n    {\n        throw new NotFoundException(\"Sipari\u015f bulunamad\u0131.\");\n    }\n\n    \/\/ Yaln\u0131zca adminler veya kendi sipari\u015fini iptal eden kullan\u0131c\u0131lar\n    if (userRole != UserRole.Admin && order.CustomerId != userId)\n    {\n        throw new UnauthorizedAccessException(\"Bu sipari\u015fi iptal etme yetkiniz yok.\");\n    }\n\n    if (order.Status == OrderStatus.Cancelled || order.Status == OrderStatus.Delivered)\n    {\n        throw new BusinessException(\"\u0130ptal edilemez durumda olan bir sipari\u015f.\");\n    }\n\n    \/\/ ... iptal mant\u0131\u011f\u0131 ...\n    order.Status = OrderStatus.Cancelled;\n    await _orderRepository.UpdateAsync(order);\n    await _orderRepository.UnitOfWork.CommitAsync();\n\n    \/\/ Stoklar\u0131 geri ekle, \u00f6demeyi iade et vb.\n    return true;\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Hassas Veri \u0130\u015fleme<\/h3>\n<p>\n    Servis katman\u0131, hassas verilerin (\u00f6rne\u011fin, kredi kart\u0131 bilgileri, ki\u015fisel tan\u0131mlay\u0131c\u0131 bilgiler) i\u015flenmesinde ve depolanmas\u0131nda g\u00fcvenlik en iyi uygulamalar\u0131n\u0131 takip eder. Bu veriler, \u015fifreleme, maskeleme ve minimum ayr\u0131cal\u0131k prensibi gibi y\u00f6ntemlerle korunur. Do\u011frudan hassas verileri depolamaktan ka\u00e7\u0131n\u0131l\u0131r ve bunun yerine tokenizasyon gibi y\u00f6ntemler tercih edilir.\n<\/p>\n<h3>G\u00fcvenlik Politikalar\u0131n\u0131n Uygulanmas\u0131<\/h3>\n<p>\n    SmartOrder'\u0131n g\u00fcvenlik politikalar\u0131, servis katman\u0131nda titizlikle uygulan\u0131r. Bu, yetkilendirme kurallar\u0131n\u0131n yan\u0131 s\u0131ra, veri b\u00fct\u00fcnl\u00fc\u011f\u00fc kontrolleri, SQL enjeksiyonu ve XSS gibi yayg\u0131n g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 koruma sa\u011flamay\u0131 da i\u00e7erir. T\u00fcm giri\u015fler sanitize edilir ve g\u00fcvenli API kullan\u0131m kal\u0131plar\u0131 benimsenir.\n<\/p>\n<h2>Test Edilebilirlik ve Bak\u0131m<\/h2>\n<p>\n    \u0130yi tasarlanm\u0131\u015f bir servis katman\u0131, kolayca test edilebilir ve uzun vadede bak\u0131m\u0131 yap\u0131labilir olmal\u0131d\u0131r. Bu, yaz\u0131l\u0131m\u0131n kalitesini ve geli\u015ftirme h\u0131z\u0131n\u0131 do\u011frudan etkiler.\n<\/p>\n<h3>Birim Testleri (Unit Tests)<\/h3>\n<p>\n    Servis katman\u0131ndaki her bir servis metodu, izole bir \u015fekilde birim testlerine tabi tutulmal\u0131d\u0131r. Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu sayesinde, servislerin ba\u011f\u0131ml\u0131l\u0131klar\u0131 (repository'ler, di\u011fer servisler) kolayca mock'lanabilir veya stub'lanabilir. Bu, her metodun kendi i\u015f mant\u0131\u011f\u0131n\u0131 do\u011fru bir \u015fekilde yerine getirip getirmedi\u011fini h\u0131zl\u0131 ve g\u00fcvenilir bir \u015fekilde do\u011frulamay\u0131 sa\u011flar.\n<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ OrderService i\u00e7in birim testi \u00f6rne\u011fi\n[Fact]\npublic async Task CreateOrder_WithValidData_ReturnsOrderDto()\n{\n    \/\/ Arrange\n    var mockOrderRepo = new Mock<IOrderRepository>();\n    var mockProductService = new Mock<IProductService>();\n    var mockPaymentService = new Mock<IPaymentService>();\n    var mockMapper = new Mock<IMapper>(); \/\/ AutoMapper i\u00e7in\n\n    var orderService = new OrderService(\n        mockOrderRepo.Object,\n        mockProductService.Object,\n        mockPaymentService.Object,\n        mockMapper.Object\n    );\n\n    var createCommand = new CreateOrderCommand\n    {\n        CustomerId = Guid.NewGuid(),\n        OrderItems = new List<OrderItemCommand>\n        {\n            new OrderItemCommand { ProductId = Guid.NewGuid(), Quantity = 1 }\n        }\n    };\n\n    var product = new Product { Id = createCommand.OrderItems[0].ProductId, StockQuantity = 10, Price = 100 };\n    mockProductService.Setup(s => s.GetProductByIdAsync(It.IsAny<Guid>())).ReturnsAsync(product);\n    mockPaymentService.Setup(s => s.ProcessPaymentAsync(It.IsAny<Guid>(), It.IsAny<decimal>())).ReturnsAsync(new PaymentResult { IsSuccess = true });\n    mockOrderRepo.Setup(r => r.UnitOfWork).Returns(new Mock<IUnitOfWork>().Object); \/\/ UnitOfWork mock'lama\n\n    \/\/ Act\n    var result = await orderService.CreateOrderAsync(createCommand);\n\n    \/\/ Assert\n    Assert.NotNull(result);\n    mockOrderRepo.Verify(r => r.AddAsync(It.IsAny<Order>()), Times.Once);\n    mockOrderRepo.Verify(r => r.UnitOfWork.CommitAsync(), Times.Exactly(2)); \/\/ Add ve Payment sonras\u0131\n    mockProductService.Verify(s => s.DecreaseStockAsync(It.IsAny<Guid>(), It.IsAny<int>()), Times.Once);\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Entegrasyon Testleri (Integration Tests)<\/h3>\n<p>\n    Birim testleri i\u015f mant\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in yeterli olsa da, servis katman\u0131n\u0131n di\u011fer katmanlarla (\u00f6zellikle veri eri\u015fim katman\u0131 ve harici servisler) do\u011fru bir \u015fekilde entegre olup olmad\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in entegrasyon testleri gereklidir. Bu testler, ger\u00e7ek veritaban\u0131 veya mock'lanm\u0131\u015f harici servislerle \u00e7al\u0131\u015farak daha geni\u015f kapsaml\u0131 senaryolar\u0131 kapsar.\n<\/p>\n<h3>Mocking ve Ba\u011f\u0131ml\u0131l\u0131klar\u0131n Y\u00f6netimi<\/h3>\n<p>\n    Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu ve iyi tan\u0131mlanm\u0131\u015f aray\u00fczler, testler s\u0131ras\u0131nda ba\u011f\u0131ml\u0131l\u0131klar\u0131 kolayca mock'lamam\u0131z\u0131 sa\u011flar. Moq gibi k\u00fct\u00fcphaneler, mock nesneler olu\u015fturarak test ortam\u0131n\u0131 kontrol etmemize ve belirli senaryolar\u0131 sim\u00fcle etmemize olanak tan\u0131r. Bu, testlerin h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 ve d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klardan etkilenmemesini sa\u011flar.\n<\/p>\n<h3>Kod Kalitesi ve Refactoring<\/h3>\n<p>\n    Servis katman\u0131, uygulaman\u0131n en s\u0131k de\u011fi\u015fen ve geli\u015fen k\u0131sm\u0131 olmaya e\u011filimlidir. Bu nedenle, kod kalitesine ve d\u00fczenli refactoring'e b\u00fcy\u00fck \u00f6nem verilmelidir. Temiz kod prensipleri, DRY (Don't Repeat Yourself), YAGNI (You Aren't Gonna Need It) ve KISS (Keep It Simple, Stupid) gibi yakla\u015f\u0131mlar, katman\u0131n uzun vadede y\u00f6netilebilir kalmas\u0131na yard\u0131mc\u0131 olur.\n<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>\n    SmartOrder uygulamas\u0131n\u0131n servis katman\u0131, i\u015f mant\u0131\u011f\u0131n\u0131n kalbi ve uygulaman\u0131n en kritik bile\u015fenlerinden biridir. Bu katman, katmanl\u0131 mimari, sorumluluklar\u0131n ayr\u0131lmas\u0131, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu ve tek sorumluluk prensibi gibi modern yaz\u0131l\u0131m prensiplerine uygun olarak tasarlanm\u0131\u015ft\u0131r. G\u00fc\u00e7l\u00fc hata y\u00f6netimi, kapsaml\u0131 g\u00fcvenlik \u00f6nlemleri ve y\u00fcksek test edilebilirlik sayesinde, SmartOrder'\u0131n servis katman\u0131, \u00f6l\u00e7eklenebilir, s\u00fcrd\u00fcr\u00fclebilir ve g\u00fcvenilir bir platform sunar. Bu sa\u011flam temel, gelecekteki geli\u015ftirmeler ve de\u011fi\u015fen i\u015f gereksinimleri kar\u015f\u0131s\u0131nda uygulaman\u0131n esnek kalmas\u0131n\u0131 sa\u011flar.\n<\/p>\n<h2>SSS (S\u0131k Sorulan Sorular)<\/h2>\n<h3>Servis katman\u0131 ile Repository katman\u0131 aras\u0131ndaki temel fark nedir?<\/h3>\n<p>\n    <strong>Repository katman\u0131<\/strong> (veri eri\u015fim katman\u0131n\u0131n bir par\u00e7as\u0131), veritaban\u0131 CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 soyutlar. Yani, verilerin nas\u0131l sakland\u0131\u011f\u0131 veya al\u0131nd\u0131\u011f\u0131yla ilgilenir. <strong>Servis katman\u0131<\/strong> ise, bu repository'leri kullanarak i\u015f kurallar\u0131n\u0131 ve s\u00fcre\u00e7lerini uygular. Servis katman\u0131 \"ne\" yap\u0131laca\u011f\u0131n\u0131 (\u00f6rne\u011fin, sipari\u015f olu\u015fturma), repository ise \"nas\u0131l\" yap\u0131laca\u011f\u0131n\u0131 (\u00f6rne\u011fin, sipari\u015fi veritaban\u0131na kaydetme) bilir.\n<\/p>\n<h3>Domain servisi ne zaman kullan\u0131lmal\u0131?<\/h3>\n<p>\n    Domain servisleri, i\u015f mant\u0131\u011f\u0131 birden fazla varl\u0131\u011f\u0131 ilgilendirdi\u011finde veya tek bir varl\u0131\u011fa ait olmayan karma\u015f\u0131k bir i\u015f kural\u0131 oldu\u011funda kullan\u0131l\u0131r. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n kredi puan\u0131na g\u00f6re indirim uygulama veya farkl\u0131 \u00fcr\u00fcn kategorileri aras\u0131nda \u00e7apraz sat\u0131\u015f \u00f6nerme gibi senaryolar domain servislerinde yer alabilir. Tek bir varl\u0131\u011f\u0131n kendi i\u00e7indeki davran\u0131\u015flar\u0131 genellikle varl\u0131\u011f\u0131n kendi metotlar\u0131 i\u00e7inde (rich domain model) veya uygulama servisleri i\u00e7inde y\u00f6netilir.\n<\/p>\n<h3>Servis katman\u0131nda transaction y\u00f6netimi nas\u0131l yap\u0131l\u0131r?<\/h3>\n<p>\n    Transaction y\u00f6netimi genellikle servis katman\u0131nda, birden fazla veritaban\u0131 operasyonunun atomik bir birim olarak y\u00fcr\u00fct\u00fclmesi gerekti\u011finde uygulan\u0131r. SmartOrder'da bu, genellikle Unit of Work deseni (repository'ler arac\u0131l\u0131\u011f\u0131yla) kullan\u0131larak yap\u0131l\u0131r. Bir servis metodu i\u00e7inde birden fazla repository i\u015flemi yap\u0131ld\u0131\u011f\u0131nda, t\u00fcm i\u015flemler ba\u015far\u0131l\u0131 olursa <code>Commit<\/code> \u00e7a\u011fr\u0131l\u0131r, aksi takdirde <code>Rollback<\/code> yap\u0131l\u0131r. Bu, veritaban\u0131 tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar.\n<\/p>\n<h3>SmartOrder'da servis katman\u0131 performans\u0131 nas\u0131l etkiler?<\/h3>\n<p>\n    \u0130yi tasarlanm\u0131\u015f bir servis katman\u0131, performans\u0131 olumlu y\u00f6nde etkileyebilir. \u0130\u015f mant\u0131\u011f\u0131n\u0131 merkezile\u015ftirerek ve gereksiz veri eri\u015fimini \u00f6nleyerek optimizasyonlara olanak tan\u0131r. Ancak, k\u00f6t\u00fc tasarlanm\u0131\u015f servisler (\u00f6rne\u011fin, gereksiz katmanlar aras\u0131 \u00e7a\u011fr\u0131lar, verimli olmayan sorgular, a\u015f\u0131r\u0131 b\u00fcy\u00fck servis metotlar\u0131) performans\u0131 olumsuz etkileyebilir. SmartOrder'da, performans kritik senaryolarda \u00f6nbellekleme, asenkron i\u015flemler ve verimli veri eri\u015fim stratejileri kullan\u0131larak performans optimize edilir.<\/p>\n","protected":false},"excerpt":{"rendered":"SmartOrder serimizin ikinci b\u00f6l\u00fcm\u00fcne ho\u015f geldiniz! \u0130lk b\u00f6l\u00fcmde sistemin genel mimarisine ve veri eri\u015fim katman\u0131na (DAL) odaklanm\u0131\u015ft\u0131k. Bu b\u00f6l\u00fcm&#8230;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-40279","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SmartOrder \u2014 B\u00f6l\u00fcm 2: Servis Katman\u0131 Mimarisi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SmartOrder \u2014 B\u00f6l\u00fcm 2: Servis Katman\u0131 Mimarisi\" \/>\n<meta property=\"og:description\" content=\"SmartOrder serimizin ikinci b\u00f6l\u00fcm\u00fcne ho\u015f geldiniz! \u0130lk b\u00f6l\u00fcmde sistemin genel mimarisine ve veri eri\u015fim katman\u0131na (DAL) odaklanm\u0131\u015ft\u0131k. Bu b\u00f6l\u00fcm...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-25T17:00:48+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"SmartOrder \u2014 B\u00f6l\u00fcm 2: Servis Katman\u0131 Mimarisi\",\"datePublished\":\"2026-02-25T17:00:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/\"},\"wordCount\":2829,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/\",\"name\":\"SmartOrder \u2014 B\u00f6l\u00fcm 2: Servis Katman\u0131 Mimarisi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-25T17:00:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SmartOrder \u2014 B\u00f6l\u00fcm 2: Servis Katman\u0131 Mimarisi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"SmartOrder \u2014 B\u00f6l\u00fcm 2: Servis Katman\u0131 Mimarisi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/","og_locale":"tr_TR","og_type":"article","og_title":"SmartOrder \u2014 B\u00f6l\u00fcm 2: Servis Katman\u0131 Mimarisi","og_description":"SmartOrder serimizin ikinci b\u00f6l\u00fcm\u00fcne ho\u015f geldiniz! \u0130lk b\u00f6l\u00fcmde sistemin genel mimarisine ve veri eri\u015fim katman\u0131na (DAL) odaklanm\u0131\u015ft\u0131k. Bu b\u00f6l\u00fcm...","og_url":"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-25T17:00:48+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"SmartOrder \u2014 B\u00f6l\u00fcm 2: Servis Katman\u0131 Mimarisi","datePublished":"2026-02-25T17:00:48+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/"},"wordCount":2829,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/","url":"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/","name":"SmartOrder \u2014 B\u00f6l\u00fcm 2: Servis Katman\u0131 Mimarisi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-25T17:00:48+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/smartorder-bolum-2-servis-katmani-mimarisi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SmartOrder \u2014 B\u00f6l\u00fcm 2: Servis Katman\u0131 Mimarisi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/40279","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=40279"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/40279\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=40279"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=40279"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=40279"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}