Varlık Çerçevesi ve katman ayrımı


12

Entity Framework ile biraz çalışmaya çalışıyorum ve katmanların ayrılmasıyla ilgili bir sorum var.

Genellikle UI -> BLL -> DAL yaklaşımını kullanıyorum ve burada EF'nin nasıl kullanılacağını merak ediyorum.

DAL'ım genellikle

GetPerson(id)
{
    // some sql
    return new Person(...)
}

BLL:

GetPerson(id)
{
    Return personDL.GetPerson(id)
}

Kullanıcı arayüzü:

Person p = personBL.GetPerson(id)

Şimdi sorum şu: EF modelimi ve DAL'ımı oluşturduğundan, EF'i kendi DAL'ımın içine sarmak iyi bir fikir mi yoksa sadece zaman kaybı mı?

EF'yi sarmam gerekmiyorsa yine de Model.esmx'imi kendi sınıf kütüphanesinin içine yerleştirir miyim yoksa sadece BLL'imin içine yerleştirip orada çalışmak iyi olur mu?

EF'i kendi DAL'ımın içine sarmanın nedenini gerçekten göremiyorum ama diğer insanların ne yaptığını bilmek istiyorum.

Yukarıdakilere sahip olmak yerine, DAL'ı bırakıp sadece şunu yaparım:

BLL:

GetPerson(id)
{
    using (TestEntities context = new TestEntities())
    {
            var result = from p in context.Persons.Where(p => p.Id = id)            
                    select p;
    }
}

Ne yapalım?

Yanıtlar:


13

Sağladığınız örnek çok katmanlı bir mimari. Kasten basitleştirildiğini biliyorum, ama:

Sunum katmanınız doğrudan Kişi kuruluşuna bağlıdır. Bu sadece en basit durumlarda sorun değil, kesinlikle katmanlarınızı tanımlamaya çalıştığınızda değil.

GetPerson yöntemi ayrıca her çağrı için yeni bir bağlam oluşturmak için oldukça kötü bir uygulama kullanıyor. Bağlamı yapıcıda almanız gerekir ve bu içerik IOC kabınız tarafından sağlanır.

Kullandığım basit ama etkili bir yapı:

  • Project.Core - görünüm modelleri ve arayüzler içerir.
  • Project.DAL - EDMX ve oluşturulan kod ile.
  • Project.BLL - iş mantığı.
  • Project.Web - web uygulamasının kendisi.

Şunu vurgulamakta yarar var:

  • Çekirdek başka bir çözüme bağımlı değildir.
  • DAL başka bir çözüme bağımlı değildir.
  • Web. Core'a bağlıdır, ancak DAL'a veya BLL'ye bağlı değildir.
  • BLL, Çekirdek ve DAL'a bağlıdır.

1
Çekirdek bir iş nesnesi katmanı gibi görünmektedir.
sq33G

Bu da ne kullandığımı hemen hemen, ancak, arayüz bildirimleri için yiyecek ve içecek sağlamak için ekstra DLL eklemek istiyorum. Bu şekilde yalnızca arabirimlere başvurursunuz (ve DI için [url = unity.codeplex.com/ CialisUnity [/url ] gibi bir şey kullanırsınız ) ve yanlışlıkla oluşturduğunuz garip bağımlılıklar olmadığından emin olabilirsiniz.
Ed James

Normalde, EF olmadan bir "Model" katmanında kendi Person sınıfımı oluşturuyorum, bu yüzden UI, BLL, DAL ve Modelim var: UI BLL ve Model biliyor. BLL, DAL ve Modeli bilir. DLL Modeli bilir. Kendi "görünüm modellerinizi" de yaratıyor musunuz ve neden EF'in oluşturduğuları kullanmıyorsunuz? (bunun katmanlı mimariye karşı olduğunu biliyorum, ama kaç kez veri alma şeklini gerçekten değiştiriyorsun?)
Thomas

Görünümünde modellerini sarma @Thomas şey soyut çok daha kolay olduğunu birim test yapacaktır.
sq33G

3
model! = modeli görüntüle
Boris Yankov

2

EDMX'inizi hiçbir şeye sarmanıza gerek yoktur.

EF'den başka bir yaklaşıma geçme ihtiyacı olasılığını öngörüyorsanız, ayrı bir İş Nesnesi katmanında tanımlanan arayüzleri uygulamak için iş nesnelerinizi (kısmi sınıflardan yararlanarak) genişletmek isteyebilirsiniz.

Daha sonra kodunuzdan sadece bu arayüzlerle ilgileneceksiniz, üretilen somut sınıflarla değil. Bunu bir arada tutmak için biraz tutkal kodu gerekebilir; EDMX ile sizin DAL'niz olabilir.


Öyleyse im EF başka bir yaklaşım için herhangi bir değişiklik öngörmüyor, yukarıdaki benim kod iyi olur? O zaman sadece UI ve BLL (EDMX BLL'de nerede) olurdu?
Thomas

Benim pragmatik cevabım evet olurdu. EDMX'i büyük ve çoğunlukla statik olacaksa kendi küçük montajına koymak isteyebileceğiniz uyarıyla, böylece sık sık yeniden derlemenize / yeniden dağıtmanıza gerek kalmaz.
sq33G

Yeniden derleme / yeniden dağıtma konusunda iyi bir nokta :)
Thomas

2

Katmanlamaya iki genel yaklaşım vardır: katı katmanlama ve rahat katmanlama.

Kesinlikle katmanlı bir yaklaşım, bir katmandaki bileşenleri yalnızca akranlarla ve doğrudan altındaki katmanla etkileşime girmeye sınırlar.

Rahat bir katmanlı uygulama, bir bileşenin herhangi bir alt katmandaki bileşenlerle etkileşime girebileceği şekilde kısıtlamaları gevşetir.

Sistemin basit çağrıları bir katmandan diğerine iletmesi gerekmediğinden, rahat katman kullanımı verimliliği artırabilir. Öte yandan, rahat tabakanın kullanılması, katmanlar arasında aynı yalıtım seviyesini sağlamaz ve daha yüksek katmanları etkilemeden daha düşük bir katmanı değiştirmeyi zorlaştırır.

Birçok yazılım bileşenini içeren büyük çözümler için, aynı soyutlama seviyesinde yapışkan olmayan çok sayıda bileşene sahip olmak yaygındır. Bu durumda, her katman ayrıca bir veya daha fazla uyumlu alt sisteme ayrıştırılabilir. Şekil 2, birden çok alt sistemden oluşan katmanları temsil etmek için olası bir Birleşik Modelleme Dili (UML) gösterimini göstermektedir.

Sonuç: Orta tabakaya ihtiyacınız yoksa kaybedersiniz; tüm uygulamalar aynı yaklaşımı gerektirmez ve bir şekilde sadece katmanlama amacıyla bir katman eklemek karmaşıklık maliyeti ve bakımı için cezalara sahip olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.