Asp.NET Web API – MongoDB

Bir süredir ara verdiğim MongoDB serisine devam ediyorum. Bu yazıda Asp.NET Web API framework ile yapılan projede MongoDB veritabanından çekilmiş olan verileri REST yapısında tüm kullanıcılara göstereceğiz. Ardından bir diğer yazıda JSON biçiminde dönen verileri sorgu ile web api’den çekip kullanacağız. Veri seti olarak MongoDB sitesi üzerinde örneklerde kullanılmak üzere paylaşılan restaurants veri setini kullanacağım. Bu linkten indirilebilir.image001

Uygulamayı local üzerinde çalıştıracağımız için cmd ekranı üzerinden mongod komutu yazılarak, server başlatılmalıdır. Eğer kurulum yapmadıysanız MongoDB giriş makelesinde kuruluş için gerekli linkler mevcuttur. İlk başta temel olarak verilerin ekranda gösterilmesi, belirli bir restaurant id değerine göre gözükmesi, güncellenmesi ve silinmesi gibi REST’in temel işlemlerini ekleyeceğim.

Öncelikle visual studio üzerinden web api projesi açıyoruz ve nuget paketlerinden mongodb offical driver’ı yükleriz. Proje yapısı aşağıdaki gibidir.  DAL yani veri ile direk temas yapacak olan kısım ayrı bir sınıf kütüphanesi olarak eklenecektir. Bu kütüphanede veriler ile yapılacak işlemler için Generic Repository ve Unit of Work patternleri uygulayarak daha güzel ve esnek bir yapı oluşturuyoruz. Oluşturulan bu esnek yapı sayesinde uygulamanın test edilebilirliği ve yönetilebilmesi kolaylaşmaktadır. Ana proje bölümünde şimdilik sadece resturantcontroller sınıfı içerisinde işlemler yapılmaktadır. Dependency Injection, authorize ve log işlemleri yapmak istersek projeye ilaveler ekleriz.

Detaylı olarak bu yapıyı bu yazıda anlatmayacağım. Bu linkte bulunan yazıda generic repository ve unit of work yapısı hakkında detaylı bilgi mevcuttur.

1

MongoDb sitesi üzerinden indirdiğimiz örnek veri setinin yapısı aşağıdaki gibidir. Bu veri setindeki yapıya uygun olarak model sınıflarımızı oluşturacağız.

2

Temel model sınıfı olan restaurant aşağıdaki gibi tanımlanmıştır. Address sınıfı restaurant sınıfı içerisine yerleştirilmiştir. Address için ayrı bir sınıf oluşturup restaurant sınıfı içerisinden çağırmaktayız. Grades bölümünde sınıflar liste biçiminde eklenmektedir. Bu sınıfı oluşturup aynı Address sınıfını eklediğimiz gibi restaurant içerisine eklemekteyiz.

35

4

Öncelikle repository sınıfı oluşturuyoruz. REST mimarisinde bulunan GET, GET by id, POST, PUT ve DELETE gibi işlemler controller içinde tanımlanır. Controller içerisinde olan REST işlemlerinin uygulayacağı işlemler repository sınıfında tanımlanmıştır. Bu tanımlanan işlemler unit of work sınıfı aracılığı ile çağrılacaktır. Aşağıda repository sınıfının tanımlanması ve constructor içerisinde yapılan tanımlamaları gösterilmektedir. Sınıf generic yapıdadır. T ile belirtilen değişkene, repository sınıfı çağrılırken data modelimiz olan Restaurant sınıfını atayacağız. Repository sınıfını UnitOfWork sınıfımız içinde örnekleyeceğiz.

6

Aşağıdaki resimde repository sınıfında tanımlanmış olan metotlar gösterilmiştir. Bu metotlar controller kısmında gerekli işlemleri yapmak için çağrılacaktır.

7

UnitOfWork sınıfı aşağıdaki gibi oluşmaktadır. Constructor içerisinde veritabanına bağlanmak için gerekli işlemler yapılıyor. Oluşturduğumuz repository sınıfı için değişken tanımlanmıştır. Bu değişken repository sınıfını döndürüyor. Eğer örneklenmemiş yani değeri boş ise new ile örnekleniyor. Eğer daha önceden örneklenmesi yapılmış ise mevcut değer tekrar dönüyor. Controller içinden GET metodunu döndürmek istersek; unitofwork.Restaurant.GetAll() yazmamız gerekiyor.

8

Controller sınıfında constructor içerisinde unitofwork örneklenmiştir. Controller sınıfında REST yapısında kullanılan işlemler tanımlanmıştır. Tüm verilerin gösterilmesi için çağrılan GETfonksiyonu ve sadece belirli ObjectId değerine göre sadece tek bir değer çekmemiz için çağrılan diğer GET fonksiyonuda gösterilmiştir.

11

Aşağıda veri eklemek için kullanılan Post metodu gösterilmiştir. Kullanıcı tarafından yollanan Restaurant modeline uygun olan veri unitofwork aracılığı ile repositoryde bulunan add fonksiyonuna gönderilip veritabanına eklenmiştir.

12

Delete metodu, silinmek istenilen verinin id değerini parametre olarak alır. Yapılacak işlem için unit of work sınıfında örneklenmiş repository sınıfında olan metod çağrılmaktadır.

13

Put metodu parametre olarak Restaurant model sınıfı formatında veri alır. Güncelleme yapmak için gerekli metoda yollar.

14

Örnek olarak belirli bir id değerine göre değer çekmeye bakalım. 57601c6da9fba760e3aeed8a ObjectId değerine karşılık gelen restaurant değeri aşağıdaki gibidir. Yapılacak REST işlemlerine göre veriler kullanılmak üzere paylaşılmaktadır.

15

Projenin kaynak kodları

Advertisements

Abstract Factory Pattern

Creational design patterns kategorisinde bulunan ve çok kullanılan abstract factory design pattern konusunda yazacağım. Uzunca bir anlatımdan ziyade bu tasarım şablonu kullanılmış bir örnek göstereceğim. Kaynakça olarak paylaşacağım linkler detaylı olarak araştırmak için yeterli olacaktır.

 “Provide an interface for creating families of related or dependent objects without specifying their concrete classes.”

Birbiri ile ilişkili veya bağımlı nesneleri onların concrete (somut) sınıflarını oluşturmadan create edilmesini sağlıyor. Tasarım şablonunu uygulamak için  nesnelerin aynı abstract class veya interface ile oluşturulmuş olması gerekmektedir. Nesnelerin arayüzleri veya soyut yapıları ile ilgilendiği için yeni bir nesne eklemek nispeten kolaylaşıyor. Abstract factory sınıf uml yapısı gösterilmiştir;

abstract

 Bu tasarım desenini ev yapımını örnek alarak anlatacağım. Ev oluşturmak için Kapı, duvar ve çatı gibi sınıflar oluşturup bu sınıfları ev fabrikası soyut sınıfı üzerinde tanımlayarak, o soyut sınıfı kullanarak ev yaratılmaktadır.

  1- Kapı soyut sınıfı oluşturduk ve ondan türetilmiş 3 tane sınıf ürettik.

doorobject

2- Aynı şekilde duvar ve çatı için soyut sınıf ve onlardan türetilmiş sınıflar ürettik.

wallandroofobject

3- Evleri üreteceğimiz ev fabrikası soyut sınıfını oluşturduk. Bu soyut sınıfı içersinde kapı, duvar ve çatı sınıflarını üretmesi için soyut metod olarak tanımlama yaptık.

housefactory

4- Ev fabrikası soyut sınıfından 2 tane ev sınıfı (villa ve apartment) ürettik. Oluşturulan bu sınıfların içerisinde ev fabrikası soyut sınıfında üretilmiş soyut metodları override ile ezdik ve gerekli tanımlamaları yaptık.

5- Aşağıda bulunan estate sınıfı ev oluşturmak için kullanılır. Constructor içinde ev fabrikası, kapı, çatı ve duvar için kullanılacak sınıfların isimleri alınarak ev için uygun nesneler oluşturulmaktadır. Gerekli parametreler ile nesne oluşturmaları yapılıyor. Ardından oluşturulan ev tipi ve nesneler console.writeline ile ekrana basılacaktır.

 6- Öncelikle oluşturmak istediğimiz tipinin nesnesini oluşturuyoruz. Ardından ev oluşturma işlemi için estate sınıfı çağrılacaktır. Constructor içine gerekli parametreler yollanıyor. Bu parametreler tanımlanan ev nesnesi,kapı,çatı ve duvar isimleridir.

createabstraact

 7-  Ekran çıktısı aşağıda gösterildiği gibidir.

main

 

Ne zaman kullanmalıyız ?

  • Sistemin nesne üretiminden bağımsız olması gerektiği durumlarda,
  • Aynı arayüz veya soyut yapıdan oluşan bir sistem ise tercih edilebilir.

Kaynaklar:

Software Design Patterns (Yazılım Tasarım Şablonları)

Herkese merhabalar. Yazılım dünyasında sıkça bahsedilen ve önemli olan yazılım tasarım şablonları ile ilgili yazı dizisi yazmaya karar verdim.

Yazılım tasarımı sırasında sıkça karşılaşılan problemlere çözüm için tasarlanmış yazılım şablonlarına denir. Birçok farklı durum için o problemi çözmek için tasarlanmış kalıplardır. Bu tanımlamalar kullanılarak yazılım tasarımı yapılmaktadır. Yazılımcıların sistem veya uygulama geliştirirken kabul ettiği en iyi tasarım alıştırmalarından oluşmaktadır.

Tasarım şablonları programlama dillerinden bağımsız olarak tanımlanmışlardır. Ancak nesne tabanlı dillerine uygun tasarım şablonları daha fazla yaygınlaşmıştır. Bu şablonlar nesneler ve sınıflar arasındaki ilişkileri ve etkileşimleri göstermektedir. Yazılımı yapacak olan kişi elinde olan soruna göre bu şablonları özelleştirerek kullanacaktır.

Test edilebilir ve kanıtlanmış bu yapıları kullanarak yazılım geliştirme sürecini hızlandırmaktayız. Kaliteli yazılım tasarımı yapmak için projeyi hayata geçirdikten sonra çıkacak problemleri yazılım geliştirme esnasında çözmeliyiz. Tekrar kullanılabilir tasarım şablonları ile oluşacak büyük sorunların önüne geçebiliriz.

Tasarım şablonları yazılım dünyasında,  (Design Patterns: Elements of Reusable Object-Oriented Software) adlı 1994 yılında yazılmış kitap sayesinde adından söz edilir hale gelmiştir. Kitabı yazan 4 yazar Gang of Four olarak adlandırılır.

Bu kitaba göre tasarım şablonları 3 gruba ayrılır;

  • Creational Patterns ( Yaratımsal Şablonlar )
  • Structural Patterns ( Yapısal Şablonlar )
  • Behavioral Patterns ( Davranışsal Şablonlar )

ooppatterns

Yukarıda gösterilen resimde her belirtilen tasarım şablonu grubunda kullanılan yaklaşımlar gösterilmektedir.

Creational Patterns ( Yaratımsal Şablonlar ):

Yazılım nesnelerinin nasıl yaratılacağı hakkında genel öneriler sunmaktadır. Mevcut duruma uyarlanarak nesne yaratma problemleri ile mücadele etmektedir. Düzensiz oluşturulan nesneler tasarım problemlerine yol açabilir. Nesne yaratımını kontrol ederek karmaşıklıkları önleme amacındadır. Uygulamaya nesne oluştururken esneklik katmaktadır. Asıl amacı, iyi bir yazılımın içinde barındırdığı nesnelerin nasıl yaratıldığından bağımsız tasarlanması gerekliliğidir.

Modern yazılım geliştirmede nesnelerin birbirleri arasında oluşan ilişki önemlidir. Herhangi bir şablon olmadan oluşturulan büyük yazılım modelleri, yeni bir özellik eklenmek istediği zaman veya eklenecek yeni bir özellik olduğunda işlemi zorlaştıracaktır. Ayrıca yeniden kullanılabilirik imkanı azalacaktır.

Ne zaman sisteme eklememiz düşünülebilir?

  • Sistemin nesne yaratımlarından bağımsız olması gerektiğinde
  • Birbiri ile bağı olan nesneleri kullanacağımız zaman
  • Nesneleri nasıl oluşturduğumuzu gizlemek istediğimiz zaman ve sadece oluştukları interfaceleri göstermek istediğimizde.
  • Sınıfların örneklemelerinin çalışma zamanında tanımlanması
  • Temelde tek bir sınıf instantination varsa ve kullanıcı sürekli bu örneklemeye erişmek isterse

Aşağıda gösterilen sınıf diyagram birçok yaratımsal tasarım şablonunda ortaktır.

Creator = Nesne arayüzünü tanımlar ve nesne döndürür.

ConcreteCreator = Nesne arayüzünü implement etmektedir.

Creational_Pattern_Simple_Structure

Structural Patterns ( Yapısal Şablonlar )

Yapısal tasarım şablonları ile dizaynı kolaylaştırarak sınıflar arasındaki iletişimi düzene sokmak için kullanılırlar. Sınıflar ve nesnelerin büyük yapıları nasıl oluşturacağı tanımlanır.

Behavioral Patterns ( Davranışsal Şablonlar )

Nesnelerin davranışları ve birbirleri ile olan ilişkileri ile ilgilenir. Davranışsal şablonları kullanılarak nesnelerin birbileri ile olan iletişimin esnekliği artmaktadır.

Tasarım şablonlarını tanıtarak giriş yapmış olduk. Sonraki yazılarımda Yaratımsal şablonlardan başlayarak, her grupta bulunan yaklaşımları örnekler ile anlatmaya çalışacağım.

Yararlandığım kaynaklar:

Software design pattern

Design Patterns: Elements of Reusable Object-Oriented Software