Skip to content
Can Özaytekin edited this page Sep 21, 2017 · 2 revisions

Introduction

Solution Katmanı Oluşturulması gerekiyor.

  1. Class Library->DevFramework.Core
  2. Class Library->DevFramework.Nortwind.Entities
  3. Class Library->DevFramework.Nortwind.DataAccess
  4. Class Library->DevFramework.Nortwind.Business
  5. ASP.NET Web Application(.NET Framework)->DevFramework.MvcWebUI
  6. Test->Test Unit->DevFramework.Nortwind.DataAccess.Test
  7. Test->Test Unit->DevFramework.Nortwind.Business.Test
  8. Web->ASP.NET Web Application(.NET Framework)->DevFramework.Nortwind.WebAPI Burada webApi seçin.
  9. Add New Site->WCF Service -> Dosya yolunu seçilmesi gerekiyor.

IEntityRepository Arayüzü Oluşturulması

  1. Klasor->DataAccess->İnterface->IEntityRepository.cs
  2. Bütün nesnelerle generic çalışması için IEntityRepository olarak tanımlıyoruz.
  3. Tüm nesneleri çekebilmek için List GetList() tanımladık.
  4. İçerisine Where sorgusu atıp filtrelemek için Linq Expression ekledik.
  5. Null olmasının sebebi sorgu atılmadığı durumlar içinde çalışması içindir.
  6. T Add ile ekleme işlemleri
  7. T Update ile güncelleme işlemleri
  8. void olarak Delete ile silme işlemleri
  9. Temel bir sıkıtlama yapmak için IEntityRepository yanına where ile referans tip olsun.
  10. Class olması gerekiyor ve new lenemebilmesi gerekiyor.
  11. Birde IEntity yazıyorum.Sonra bunu Entities diye bir klasör oluşturup altına interface olarak ekliyorum.
  12. Sonra Resharp ile referans tanımlamasını yapıyorum.

IQueryableRepository Arayüzünün Yazılması

  1. Listlerle çalışıldığı zaman Context'i açıp kapatırız.Burda Context kapatılmadan çalıştırılması için bir repository yazılması gerekiyor.
  2. DataAccess Klasör->IQueryableRepository interface oluşturuyoruz.
  3. IEntityRepository deki gibi sınırlandırmalar tanımlıyoruz.
  4. Burada IQueryableRepository sadece Select operasyonları için kullanılır.
  5. IQueryable Table {get;} olarak tanımladık.

Entity Framework İmplementasyonunun Yapılandırılması

  1. DataAcces'e yeni bir teknoloji ile çalışılacaksa klasörünü oluşturmamız gerekir.
  2. DevFramework.Core->DataAcces Klasörü->EntityFramework Klasörü oluşturuyoruz.
  3. Daha sonra NHibernate teknoloji ile çalışacaz.Bu yüzden buraya NHibernate Klasörüde ekliyorum.
  4. İlk olarak bu klasör altına bir class oluşturup EfEntityRepositoryBase oluşturuyorum.
  5. EfEntityRepositoryBase<IEntity,Context>:IEntityRepository where TEntity:class,IEntity,new şeklinde tanımlıyoruz.
  6. Ek olarak where TContext:DbContext tanımlıyoruz.Tabi Entity Framework olmadığı için şuan çalışmaz.
  7. Bu yüzden DevFramework.Core->Nuget Package->EntityFramework yüklemesi yapıyoruz.
  8. Kurulum tamamlandıktan sonra sınıfları implemente ediyoruz.

EntityFramework İmplementasyonunun Gerçekleştirilmesi

  1. GetList ile başlayalım.Bir context Disposable(Tek Kullanımlık) olduğu için Using kullanarak içine var context=new TContext() diyerek çalışacağımız Context'i belirliyoruz.
  2. Eğer bir sorgu gelmediyse null olacaktır.
  3. Bu yüzden return filter==null
  4. Eğer boşsa diyerek ?context.Set.ToList():
  5. Eğer doluysa diyerek :context.Set.Where(filter).ToList();
  6. Şimdi Get kısmına geçelim. Aynı seyleri yapıyoruz. Using içerisine return context.Set().SingleOrDefault(filter);
  7. Sıra geldi Add operasyonuna Using içerisine ilk olarak context'te ilgili nesneye abone olmam gerekiyor.
  8. var addedEntity = context.Entry(entity); olarak ilgili nesneye abone oluyoruz.
  9. addedEntity.State=EntityState.Added; durumunuda eklenecek data olarak belirtiyoruz.
  10. Nesneye ekleme işleminden sonra context.SaveChanged(); context'in son halini kayıt altına alıyoruz.
  11. Son olarak return Entity; yazarak nesneyi return etmiş oluyoruz.
  12. Update işlemi için ise yine Using içersine add'deki kodların aynısını yazıyoruz.Tek farkı add değilde update olarak tanımlıyoruz.
  13. Değişen yerler ise: var updateEntity yapıcaz. Birde updatedEntity.State = EntityState.Modified; olarak değiştiriyoruz.
  14. Delete kısmında ise using içerisine add'deki kodları yazıyoruz.İlk olarak return entity; satırını siliyoruz.Çünkü method void olduğu için gereksizdir.
  15. Add'den farklı olarak değişen yerler ise: var deleteEntity kısmı ve deleteEntity.State = EntityState.Deleted; olarak değiştiriyoruz.
  16. Burada generic bir şekilde entityframeworkün temel implementasyounu gerçekleştirmiş olduk.

Entity Framework İçin IQueryable İmplementasyonunun Yapılması

  1. EntityFramework klasörüne -> EfQueryableRepository.cs olarak bir class tanımlıyorum.
  2. Class içerisinde daha önce EfEntityRepositoryBase'deki gibi : IQueryableRepository where T:class, IEntity, new() şekilde tanımlıyorum.
  3. Hemen implementasyounu gerçekleştiriyorum.
  4. public IQueryable Table {get;} olarak geliyor.
  5. Bu implementasyounu çalışması için bizim bir DbContext dependency injection olarak eklememiz gerekiyor.
  6. Madem DbContext ekledik bunu initialise edilmesi gerekir.
  7. Bu sayede iş katmanının herhangi bir projeye bağlı olmasını öne geçer.Bu tabiki bir DbSet'e karşılık gelebilir.
  8. Burada private IDbSet _entities; olarak tanımlıyoruz.
  9. Burada bunu tanımladığımız şeyleri protected virtual IDbSet Entities yazıp içerisine hazırlamaya başlıyoruz.
  10. GET kısmına if(_entities==null) ise _entities=_context.Set(); olarak yazıp daha sağlıklı hale getiriyoruz.
  11. Sonra biz bunu test ederiz.Daha iyi farkı görmüş oluruz.

NHibernateHelper Kavramı ve İmplementasyonunun Yapılması

Burada amaç EntityFramework gibi farklı ORM'ler için bağlantı altyapısı oluşturmak için bize NHibernateHelper gerekmektedir.

  1. DevFramework.Core -> NHibernate klasörü -> NHibernateHelper.cs oluşturuyoruz.
  2. İçerisinde : IDispoasable implementasyounu yapmamız gerekiyor.
  3. Sonra Nuget Package üzerinden NHibernate kurulumu yapmamız gerekiyor.
  4. private static ISessionFactory _sessionFactory; olarak tanımlıyoruz.Bu bize bağlantı Oracle dan mı? MySql'den mi? bunun bilgisini döndürmek.
  5. Burada public virtual ISessionFactory SessionFactory içerisinde get kısmında return _sessionFactory??(_sessionFactory=InitializeFactory() olarak tanımlıyoruz.
  6. Tabi biz burda InitializeFactory'i kendimiz yazıyor olacağız.
  7. Biz InitializeFactory'i implementasyonunu gerçekleştiriyorum.
  8. Burada NHibernate classını abstract bir class haline getirmemiz gerekiyor.Sebebi bu classı birileri kullanıcaksa ezebilecek olması gerekiyor.
  9. Burda önemli bir nokta var. Virtual ISessionFactory'i ve Void Dispose gelirler.Ama bizim neye göre ezilceklerini belirlememiz gerekiyor.
  10. protected abstract ISessionFactory InitializeFactory(); olarak bir düzen oluşturmamız gerekiyor.
  11. Birde bizim burada Context'i açmamız gerekli ki işlemleri çalışır hale getirebilelim.
  12. public virtual ISession OpenSession() içersine return SessionFactory.OpenSession(); dememiz gerekiyor.
  13. void Dispose'da ise Garbage Collectore kullanarak GC.SuppressFinalize(this);

NHibernate İmplementasyonu

  1. NHibernate klasörü -> NhEntityRepositoryBase class'ını ekliyoruz.
  2. Burada NhEntityRepositoryBase ekliyoruz.
  3. Burada kullanıcı hangi teknoloji ile çalışacağını bilemeyeceğimizden NHibernateHelper oluşturmamız gerekiyor.
  4. Bunun imple ve tabiki IEntityRepository'den kalıtım aldırmamız gerekiyor.
  5. Burada İmplementasyonu yapmamız gerekecek.
  6. Burdadaj diğerlerinde yaptığımız gibi where TEntity:class,IEntity,new() gibi defansif kurallar tanımlamamız gerekir.