Katmanlı Mimari Hakkında Sorularım
-
Merhaba hocalar çok uzatmayıp direk konuya gireyim bi video eğitim setinden çok katmanlı mimariyi ögrenmeye çalışıyorum ama tıkandığım bi nokta var videodaki adam Project.Entities class library sinde classlarını tek tek yaziyor anladığım kadarıyla code first deniyor buna ben sql serverda tablolarımı hazırladım doğru mu yaptım emin degilim ama dümdüz Project.Entities e sağ tıklayıp add new itemdan ado.net entity data modelimi ekledim sonra gittim project.dal ın referanslarına project.entity yi ekledim şimdi adam gitti EntityFramework klasörünün içinde projectcontext class ini oluşturdu içinede dbsetlerini yazdı sonra gitti EfUsersDal da private ile context ini tanımlayıp direk ekleme çıkarma kodlarını yazmaya başladı bende tam bu noktada takıldım çünkü ben data model ekledim benim dbsetlerim zaten data model içinde tekrar ProjectContext de yazmama gerek yok diye düşünüyorum şimdi ortadaki resimdeki using kodunu ben ekledim işin içinden çıkamadığım noktada burası şimdi ben ProjectContext emi bişiler yazip bu EfUsersDal 'a referans verip o şekildemi ilerlemem lazım yoksa bu using ilemi kullanmam doğru yada ben çok başka alemlere girip kayıp mı oldum bilmiyorum. Yardımcı olan arkadaşlara şimdiden teşekkürler.
-
Hocam şöyle düşün
İnsanın yeme, sindirme ve boşaltma sistemi gibi katmanlarını oluştur. (class librarry)
yeme (class library)
dil.cs
dis.cs
yemekborusu.cs
sindirme (class library)
mide.cs
asitler.cs
bosaltma (class library)
kalinbarsak.cs
incebarsak.cs
Daha sonra mesela incebarsak'a direk olarak mideden bir şey göndereceksen incebarsak.cs içerisine sindirme uzayını import edip (mide ve asitler) adlı sınıfları kullanabilirsin.
-
ontedi bunu yazdı
hocam cevabın için teşekkürler katmanlı mimarinin ne oldugunu anladığımı sanıyorum benim şuan takıldıgım nokta o aradaki köprüyü doğru kurmak için yazılması gereken kod ve nereye yazılacağı tekrardan ilgilendiğin için teşekkürler.
-
sen dbfirst yaklaşımı ile gittiğin için context oluşturmana gerek yok hocam, direk model üzerinden çalışabilirsin. Yapman gereken model instance ı oluşturup onun üzerinden CRUD işlemleri yapıp daha sonra create/update için save metodunu çağırman yeterli
-
unbalanced bunu yazdı
sen dbfirst yaklaşımı ile gittiğin için context oluşturmana gerek yok hocam, direk model üzerinden çalışabilirsin. Yapman gereken model instance ı oluşturup onun üzerinden CRUD işlemleri yapıp daha sonra create/update için save metodunu çağırman yeterli
çok teşekkürler hocam dediğini anladım ama bu model intance mi nerde nasıl vereceğim ortadaki EfUsersDal class imda using ilemi ilerlemem gerekiyor yoksa başka bir şekildemi bana bir örnek kod gösterebilir misin?
-
ANZAK bunu yazdıunbalanced bunu yazdı
sen dbfirst yaklaşımı ile gittiğin için context oluşturmana gerek yok hocam, direk model üzerinden çalışabilirsin. Yapman gereken model instance ı oluşturup onun üzerinden CRUD işlemleri yapıp daha sonra create/update için save metodunu çağırman yeterli
çok teşekkürler hocam dediğini anladım ama bu model intance mi nerde nasıl vereceğim ortadaki EfUsersDal class imda using ilemi ilerlemem gerekiyor yoksa başka bir şekildemi bana bir örnek kod gösterebilir misin?
Hocam,
Başka bir katmana daha ihtiyacın var,
EfUserDal classında DB işlemlerini yaptığını düşünüyorum intefaceye bağlı olarak.
Senin EF işlemlerini yapan bu katmanı çağıraağın ayrı bir katmanın daha olmalı diye düşünüyorum.
Interface Ok.
EF İşlemleri OK.
EF Context leri Ok.
Peki bu işlemleri nerede çağıracaksın ayrı bir katmanda. Yani model instanceni diğer katmanda oluşturmalısın diye düşünüyorum.
Using e gerek yok referans değil ki bu clasın kopyasını oluştursan kafi.
-
Projenin boyutuna göre değişir. Şuan business layer'ı tek bi yerde kullanmandan ötürü ne gerek var diyosundur.
Fakat projenin içerisine webservice (webapi veya soap), workflow vs. girdiği zaman poco veya dto'ların gerekli olduğunu görürsün.
http://blog.jorgef.net/2010/09/n-tiers-pocos-ef-1.html
http://rlacovara.blogspot.com.tr/2009/03/what-is-difference-between-dto-and-poco.html
İlk karşına çıkacak olan hata :
-
ANZAK bunu yazdıunbalanced bunu yazdı
sen dbfirst yaklaşımı ile gittiğin için context oluşturmana gerek yok hocam, direk model üzerinden çalışabilirsin. Yapman gereken model instance ı oluşturup onun üzerinden CRUD işlemleri yapıp daha sonra create/update için save metodunu çağırman yeterli
çok teşekkürler hocam dediğini anladım ama bu model intance mi nerde nasıl vereceğim ortadaki EfUsersDal class imda using ilemi ilerlemem gerekiyor yoksa başka bir şekildemi bana bir örnek kod gösterebilir misin?
Project.Entities e gerek yok hocam bu durumda.. Direk Dal projende oluştur..
@zeybekustasi nin dediği kısım senin Business Logic Layer'in olacak sanırım onun da projesini oluşturmuşsun ama yapmamışsın henüz.
Bu arada custom class lar oluştur ve business class ın presentation layer a ( view/gui) bu custom class ları yollasın.
Mesela şöyle örnek vereyim..
Kişiler ve Adresler diye tablon var. Sana X kişisi ile ilgili şahsi bilgi ve adresi gerekiyor. Ama bunlar iki farklı tabloda oldukları için bir şekilde birleştirme yapman lazım.
Başka bir proje oluştur ve modellerini (custom class oluyor sende) burada oluştur ve atıyorum ismi Person olsun
public class Person { public string Name {get; set;} public string Surname {get; set;} public string Address {get; set;} public string Country {get; set;} }
gördüğün gibi kişi ve adres bilgileri için tek bir sınıf oluşturdum.
DAL tarafında iki ayrı metodun olacak hem adres hem kişi çekebilmen için. Ancak business katmanında ise tek metodun olacak ve üstteki Person u dönderecek.. Mesela
public Person GetPersonByEmail(string email) { Kisi kisi= dalprojen.GetPersonByEmail(email); Adres adres = dalprojen.GetAdresByKisiId(kisi.Id); return new Person { Name = kisi.Name, Surname = kisi.Surname, Address = adres.Adres, Country = adres.Ulke }; }
bu şekilde gördüğün gibi custom class üzerinden iş yapıyoruz. İzlediğin set nedir bilmiyorum ama bu şekilde ilerlemen daha doğru olur. Böylece kullanıcılara işe yaramayan bilgi göndermezsin..
Not: kodları elle yazıyorum o yüzden syntax hataları olabilir.
unbalanced tarafından 02/Şub/16 01:22 tarihinde düzenlenmiştir -
SinusX bunu yazdı
Projenin boyutuna göre değişir. Şuan business layer'ı tek bi yerde kullanmandan ötürü ne gerek var diyosundur.
Fakat projenin içerisine webservice (webapi veya soap), workflow vs. girdiği zaman poco veya dto'ların gerekli olduğunu görürsün.
http://blog.jorgef.net/2010/09/n-tiers-pocos-ef-1.html
http://rlacovara.blogspot.com.tr/2009/03/what-is-difference-between-dto-and-poco.html
İlk karşına çıkacak olan hata :
hocam senin dediğin işin biraz farklı boyutu. Web serviste kullanılacak modeller olsa dahi benim üstte yazdığım mantık ile gidebilir. Sadece ilgili class ların/enumların datamember olarak işaretlemesi kafi..
Kalan işi de business layer da operation larda yapacak. Ama arkadaş daha DAL kısmını çözememiş . Senin bahsettiğin serilizasyon olaylarının onlarca sıkıntısı var :) bu iş sadece .net tabanlı da olmuyor, java da ayrı bir sıkıntı çıkarıyor, dictironary de complex class kullanımında ayrı bir sıkıntı çıkarıyor vs. O yüzden dikkat edilmesi gereken yığınla şey var, en basitinden kullanılacak endpoint türü bile farklı. Ama restful servis yapacaksa bir şey kasmasına gerek yok, json/xml gönderip alabilir onların serileştirmesinde pek sıkıntı yok tüm diller ve platformlar için. Ama dediğim gibi sorun şimdilik farklı yerde.
-
unbalanced bunu yazdıSinusX bunu yazdı
Projenin boyutuna göre değişir. Şuan business layer'ı tek bi yerde kullanmandan ötürü ne gerek var diyosundur.
Fakat projenin içerisine webservice (webapi veya soap), workflow vs. girdiği zaman poco veya dto'ların gerekli olduğunu görürsün.
http://blog.jorgef.net/2010/09/n-tiers-pocos-ef-1.html
http://rlacovara.blogspot.com.tr/2009/03/what-is-difference-between-dto-and-poco.html
İlk karşına çıkacak olan hata :
hocam senin dediğin işin biraz farklı boyutu. Web serviste kullanılacak modeller olsa dahi benim üstte yazdığım mantık ile gidebilir. Sadece ilgili class ların/enumların datamember olarak işaretlemesi kafi..
Kalan işi de business layer da operation larda yapacak. Ama arkadaş daha DAL kısmını çözememiş . Senin bahsettiğin serilizasyon olaylarının onlarca sıkıntısı var :) bu iş sadece .net tabanlı da olmuyor, java da ayrı bir sıkıntı çıkarıyor, dictironary de complex class kullanımında ayrı bir sıkıntı çıkarıyor vs. O yüzden dikkat edilmesi gereken yığınla şey var, en basitinden kullanılacak endpoint türü bile farklı. Ama restful servis yapacaksa bir şey kasmasına gerek yok, json/xml gönderip alabilir onların serileştirmesinde pek sıkıntı yok tüm diller ve platformlar için. Ama dediğim gibi sorun şimdilik farklı yerde.
Yok çok detaya inmeden için üstün körü geçtim kafasında canlanması için. Ne yapacağını bilmeden kafasında oluşmaz. Yeni başlayan çoğu kişi aynı duruma düşüyor
-
hocalar tekrar üşenmeden yazdığınız için teşekkürler
@zeybekustasi
hocam videoyu biraz ileriye aldım adam ayriyeten Project.Interfaces diye ayriyeten bi class library oluşturuyo orayada IUsersService diye bi class açıp gene IUsersDaldakileri yaziyor ama bunu bu sefer BLL katmanında çagariyor orda içini dolduruyor bahsettiğin şey bu mu acaba?
@SinusX
hocam senin dediklerini anlayamadım şimdi cahil cahilde konuşmak istemiyorum dediklerini biraz daha inceleyeceğim sanırım dediklerini şu bahsettiğin hatayı alınca anlayacağım.
@unbalanced hocam entities katmanını sildim modeli aldım dal katmanına ekledim EfUsersDal dada aşağıda resimde gösterdiğim gibi çagardım umarım doğru anlamış ve doğru uygulamıştırım şu aklıma takıldı bu DbEntities 'i oluşturacağım her Ef...Dal classim için bu şekilde mi çagarmaliyim yani doğru kullanım bu mudur acaba? Ayriyeten bu custom class örneğini çok begendim bi kaç adım sonra çok işime yaracak