-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Can Özaytekin edited this page Sep 21, 2017
·
2 revisions
Solution Katmanı Oluşturulması gerekiyor.
- Class Library->DevFramework.Core
- Class Library->DevFramework.Nortwind.Entities
- Class Library->DevFramework.Nortwind.DataAccess
- Class Library->DevFramework.Nortwind.Business
- ASP.NET Web Application(.NET Framework)->DevFramework.MvcWebUI
- Test->Test Unit->DevFramework.Nortwind.DataAccess.Test
- Test->Test Unit->DevFramework.Nortwind.Business.Test
- Web->ASP.NET Web Application(.NET Framework)->DevFramework.Nortwind.WebAPI Burada webApi seçin.
- Add New Site->WCF Service -> Dosya yolunu seçilmesi gerekiyor.
- Klasor->DataAccess->İnterface->IEntityRepository.cs
- Bütün nesnelerle generic çalışması için IEntityRepository olarak tanımlıyoruz.
- Tüm nesneleri çekebilmek için List GetList() tanımladık.
- İçerisine Where sorgusu atıp filtrelemek için Linq Expression ekledik.
- Null olmasının sebebi sorgu atılmadığı durumlar içinde çalışması içindir.
- T Add ile ekleme işlemleri
- T Update ile güncelleme işlemleri
- void olarak Delete ile silme işlemleri
- Temel bir sıkıtlama yapmak için IEntityRepository yanına where ile referans tip olsun.
- Class olması gerekiyor ve new lenemebilmesi gerekiyor.
- Birde IEntity yazıyorum.Sonra bunu Entities diye bir klasör oluşturup altına interface olarak ekliyorum.
- Sonra Resharp ile referans tanımlamasını yapıyorum.
- 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.
- DataAccess Klasör->IQueryableRepository interface oluşturuyoruz.
- IEntityRepository deki gibi sınırlandırmalar tanımlıyoruz.
- Burada IQueryableRepository sadece Select operasyonları için kullanılır.
- IQueryable Table {get;} olarak tanımladık.
- DataAcces'e yeni bir teknoloji ile çalışılacaksa klasörünü oluşturmamız gerekir.
- DevFramework.Core->DataAcces Klasörü->EntityFramework Klasörü oluşturuyoruz.
- Daha sonra NHibernate teknoloji ile çalışacaz.Bu yüzden buraya NHibernate Klasörüde ekliyorum.
- İlk olarak bu klasör altına bir class oluşturup EfEntityRepositoryBase oluşturuyorum.
- EfEntityRepositoryBase<IEntity,Context>:IEntityRepository where TEntity:class,IEntity,new şeklinde tanımlıyoruz.
- Ek olarak where TContext:DbContext tanımlıyoruz.Tabi Entity Framework olmadığı için şuan çalışmaz.
- Bu yüzden DevFramework.Core->Nuget Package->EntityFramework yüklemesi yapıyoruz.
- Kurulum tamamlandıktan sonra sınıfları implemente ediyoruz.
- 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.
- Eğer bir sorgu gelmediyse null olacaktır.
- Bu yüzden return filter==null
- Eğer boşsa diyerek ?context.Set.ToList():
- Eğer doluysa diyerek :context.Set.Where(filter).ToList();
- Şimdi Get kısmına geçelim. Aynı seyleri yapıyoruz. Using içerisine return context.Set().SingleOrDefault(filter);
- Sıra geldi Add operasyonuna Using içerisine ilk olarak context'te ilgili nesneye abone olmam gerekiyor.
- var addedEntity = context.Entry(entity); olarak ilgili nesneye abone oluyoruz.
- addedEntity.State=EntityState.Added; durumunuda eklenecek data olarak belirtiyoruz.
- Nesneye ekleme işleminden sonra context.SaveChanged(); context'in son halini kayıt altına alıyoruz.
- Son olarak return Entity; yazarak nesneyi return etmiş oluyoruz.
- 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.
- Değişen yerler ise: var updateEntity yapıcaz. Birde updatedEntity.State = EntityState.Modified; olarak değiştiriyoruz.
- 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.
- Add'den farklı olarak değişen yerler ise: var deleteEntity kısmı ve deleteEntity.State = EntityState.Deleted; olarak değiştiriyoruz.
- Burada generic bir şekilde entityframeworkün temel implementasyounu gerçekleştirmiş olduk.
- EntityFramework klasörüne -> EfQueryableRepository.cs olarak bir class tanımlıyorum.
- Class içerisinde daha önce EfEntityRepositoryBase'deki gibi : IQueryableRepository where T:class, IEntity, new() şekilde tanımlıyorum.
- Hemen implementasyounu gerçekleştiriyorum.
- public IQueryable Table {get;} olarak geliyor.
- Bu implementasyounu çalışması için bizim bir DbContext dependency injection olarak eklememiz gerekiyor.
- Madem DbContext ekledik bunu initialise edilmesi gerekir.
- 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.
- Burada private IDbSet _entities; olarak tanımlıyoruz.
- Burada bunu tanımladığımız şeyleri protected virtual IDbSet Entities yazıp içerisine hazırlamaya başlıyoruz.
- GET kısmına if(_entities==null) ise _entities=_context.Set(); olarak yazıp daha sağlıklı hale getiriyoruz.
- Sonra biz bunu test ederiz.Daha iyi farkı görmüş oluruz.
Burada amaç EntityFramework gibi farklı ORM'ler için bağlantı altyapısı oluşturmak için bize NHibernateHelper gerekmektedir.
- DevFramework.Core -> NHibernate klasörü -> NHibernateHelper.cs oluşturuyoruz.
- İçerisinde : IDispoasable implementasyounu yapmamız gerekiyor.
- Sonra Nuget Package üzerinden NHibernate kurulumu yapmamız gerekiyor.
- private static ISessionFactory _sessionFactory; olarak tanımlıyoruz.Bu bize bağlantı Oracle dan mı? MySql'den mi? bunun bilgisini döndürmek.
- Burada public virtual ISessionFactory SessionFactory içerisinde get kısmında return _sessionFactory??(_sessionFactory=InitializeFactory() olarak tanımlıyoruz.
- Tabi biz burda InitializeFactory'i kendimiz yazıyor olacağız.
- Biz InitializeFactory'i implementasyonunu gerçekleştiriyorum.
- Burada NHibernate classını abstract bir class haline getirmemiz gerekiyor.Sebebi bu classı birileri kullanıcaksa ezebilecek olması gerekiyor.
- Burda önemli bir nokta var. Virtual ISessionFactory'i ve Void Dispose gelirler.Ama bizim neye göre ezilceklerini belirlememiz gerekiyor.
- protected abstract ISessionFactory InitializeFactory(); olarak bir düzen oluşturmamız gerekiyor.
- Birde bizim burada Context'i açmamız gerekli ki işlemleri çalışır hale getirebilelim.
- public virtual ISession OpenSession() içersine return SessionFactory.OpenSession(); dememiz gerekiyor.
- void Dispose'da ise Garbage Collectore kullanarak GC.SuppressFinalize(this);
- NHibernate klasörü -> NhEntityRepositoryBase class'ını ekliyoruz.
- Burada NhEntityRepositoryBase ekliyoruz.
- Burada kullanıcı hangi teknoloji ile çalışacağını bilemeyeceğimizden NHibernateHelper oluşturmamız gerekiyor.
- Bunun imple ve tabiki IEntityRepository'den kalıtım aldırmamız gerekiyor.
- Burada İmplementasyonu yapmamız gerekecek.
- Burdadaj diğerlerinde yaptığımız gibi where TEntity:class,IEntity,new() gibi defansif kurallar tanımlamamız gerekir.