DAL ve BLL Katmanları arasında veri ve iş nesnelerini almanın ayrılması


9

Bu soruyu göndermeden önce biraz araştırma yaptım. Diğer sorular veya gönderilerin yanı sıra, bunlardan biri aşağıda verilmiştir. Nasıl belirleyeceğime dair net bir fikrim yoktu.

Veri Erişim Katmanındaki İş Nesneleri

Bir havuz var ve iş katmanları veri almak için havuzu çağırır. Örneğin, BLL ve DAL için aşağıdaki sınıflarım olduğunu varsayalım:

class BllCustomer
{
    public int CustomerId {get; set;}
    public String Name {get; set;}
    public BllAddress Address {get; set;}
}

class BllAddress
{
     public int AddressId {get; set;}
     public String Street {get; set;}
     public String City {get; set;}
     public String ZipCode {get; set; }
}

class DalCustomer 
{
    public int CustomerId {get; set;}
    public String Name {get; set;}
    public int AddressID {get; set;}
}

class DalAddress
{
     public int AddressId {get; set;}
     public String Street {get; set;}
     public String City {get; set;}
     public String ZipCode {get; set; }
}

BLL bir Müşteri nesnesi almak istiyorsa, DAL'de GetCustomerById (customerId) öğesini çağırır.

Açık bir zihin bulamadığım endişelerim şunlardır:

  1. Nasıl DAL GetCustomerById dönmesi gerektiğini belirlemek için göremiyorum? BllCustomer veya DalCustomer döndürmeli mi?

  2. Müşteriyle ilişkili adresin alınması (ve / veya İşletme nesnesine dönüştürülmesi) nerede olmalıdır?

DAL Dal nesnelerini döndürürse, Adres'i almak ve doldurmak için mantık yalnızca BLL'de olabilir. DAL, BLL nesnelerini döndürürse, Adres'i almak ve doldurmak için mantık BLL veya DAL'de olabilir. Şu anda DAL, İş Nesnelerini döndürüyor ve doldurmak için mantık DAL'de.

Okuduğum kadarıyla, doğru ya da yanlış yoktur sanırım. Yukarıda verilen bağlantıdan, insanlar bir şekilde, diğerleri ise başka şekilde söylüyor. Ama benim durumum için hangisinin en iyi olacağını nasıl belirleyebilirim?

Herhangi bir yardım mutluluk duyacağız.


2
İlk sorum şu olurdu: Bu eski bir uygulama mı? Orada bu tür kodları eskimiş hale getiren çok sayıda ORM Çerçevesi var ve sizi böyle bir çerçeveyi düşünmenizi tavsiye ediyorum ...
JDT

@JDT Ne demek istediğinizden emin değilim, Entity Framework kullanıyorum ve aynı sorunu yaşıyorum. Anladığım kadarıyla, ORM'nizi etki alanı nesneleri olarak kullanmamanız gerekiyor, öyleyse çeviri nerede yapılır?
pseudocoder

ORM çerçeveniz neden etki alanı nesnesi olan nesneleri döndürmüyor?
JDT

3
@JDT ORM (bu durumda EF), genellikle sınıf başına bir veritabanı tablosunu temsil eden varlık sınıflarını döndürür. Bu genellikle etki alanı sınıflarına benzer, ancak zorunlu olarak aynı değildir. Belki de sadece ORM sınıflarını etki alanı sınıfları olarak kullanmanın uygun olduğunu söylüyorsunuz? Birkaç yerde bunun hayır diye bir şey okudum.
sözde

Yanıtlar:


5

Nasıl DAL GetCustomerById dönmesi gerektiğini belirlemek için göremiyorum? BllCustomer veya DalCustomer döndürmeli mi?

Bir DalCustomer nesnesi döndürmelidir, bir BllCustomer nesnesi döndürmek tek sorumluluk ilkesini bozacaktır . DalCustomer nesnesini, iş katmanı (veya tüketici) tarafından kullanılan arayüz veya sözleşme olarak görüntüleyebilirsiniz . Aslında bir BllCustomer döndürdüyse , DAL onu çağıran veya potansiyel olarak adlandırabilecek her iş katmanı nesnesine hitap etmek zorunda kalacaktı.

Müşteriyle ilişkili adresin alınması (ve / veya İşletme nesnesine dönüştürülmesi) nerede olmalıdır?

Dönüşüm bir görünüm modelinde veya yöneticisinde yapılmalıdır . Hizmetinizi veya veri erişim bileşeninizi aramak için bir aracınız olması gerekir. İhtiyaç duyarsanız, BllCustomer nesnenizde bir dönüşüm yapabilirsiniz . Ancak, DAL'nizi MSSQL'den Oracle'a değiştirdiğinizde, örneğin döndürülen nesneniz (veya arayüzünüz) aynı kalmalıdır.

Tercihen iş katmanınız da Veri Katmanınızdan bağımsız olmalıdır. İş Katmanı, iş kurallarınızdan sorumludur. Burada, iş kurallarınızı uygulamak için bir doğrulama çerçevesi kullanarak doğrulamalarınızı ekleyeceksiniz.


4

Deponuz BLL veya etki alanı nesnesini döndürmelidir. muhtemelen bir DAL nesnesine ihtiyacınız yoktur.

public class Customer
{
    public string Name {get; private set;}
    public Customer(string name)
    {
        this.Name = name;
    }
}

public class Repository
{
    public Customer GetCustomer(string id)
    {
        //get data from db
        return new Customer(datarow["name"]);
    }
}

BLL veya ayrı bir sınıf kütüphanesi gibi somut sınıflar yerine arayüzler açmalı Customermı?
Yola

1
Hayır. Somut dersleri ifşa etmenin cezası. Havuz için bir arayüz yararlı olacaktır
Ewan

3

Tipik olarak, DAL'nin BLL hakkında bilgisi yoktur. Bu şekilde düşünün, farklı bir BLL içeren farklı bir uygulama aynı DAL'yi kullanabilir. Aynı şirket için bir Borçlar uygulaması / modülü ve bir Alacak uygulaması verileri (müşteriler, ücretler, ödemeler vb.) Paylaşır. Bir DLL birden fazla BLL bilgisine sahip olmaya çalışmak çok zor ve gereksiz olacaktır. Bu ayrıca, BLL üzerinde herhangi bir etkisi olmadan veri depolama alanınızı değiştirmenize izin verir (arayüzleri bozmadığınız sürece).

Artık bir DAL nesnesini BLL'ye geçirebilir veya üçüncü bir nesne kümesi oluşturabilirsiniz: Varlık. Bunlar sadece birlikte iletilecek değerleri içerir. DAL varlığı referans alır ve depolama alanınız / veritabanınızla etkileşime girer ve BLL tüm mantığı işler ve DAL'ı referans alır.

class EntCustomer
{
    public int CustomerId {get; set;}
    public String Name {get; set;}
    public BllAddress Address {get; set;}
}
class BllCustomer
{
   //reference EntCustomer, DalCustomer and handle business rules/logic
}

class DalCustomer 
{
   //reference EntCustomer and interact with data storage
}

Yorumun için teşekkür ederim. Size katılıyorum .. DAL / (Depomuz) türünün A türü gibi mantıklarla zaten dolu olduğunu görebiliyorum, sonra tablo B'den veri alın, ancak tür C ise, tablodan veri alın C. Ama EntCustomer kullanan örneğinizle kafam karıştı. Benim durumumda, DalCustomer DB tabloların aynasıdır. EntCustomer'ın nasıl kullanıldığını veya neden kullanmam gerektiğini ve faydalarından daha fazla örnek verebilir misiniz? DalObjects'i BLL'ye döndürmek için DAL'ı değiştirmeyi düşünüyorum. Bll Business Objs dönüşüm hangle, almak ve iç içe obj doldurun.
ShamirDaj

Daha fazla geri bildirim verebilir misiniz?
ShamirDaj

Ent-nesnelerinin amacının sadece DAL ve BLL arasında veri aktarmak olduğunu düşünüyorum. DAL sınıflarınız db yapısını yansıtmaya devam edebilir, ancak bu sınıflar DAL için dahili olacaktır. BLL DAL'den veri istediğinde, DAL gerekli DAL nesnelerini veritabanından alır (dalcustomer + daladdress) ve onlardan EntCustomer örneği oluşturur ve BLL'ye döndürür.
artokai

-1

DAL, DAL'a bağlı olarak BL ve BL'den bağımsız olmalıdır. Kullanıcı arayüzünüz verilere yalnızca BL yoluyla erişmelidir. DataTable veya DataRow'u DAL'den döndürüp DataTable / DataRow'u BL nesnelerine dönüştürürseniz iyi bir uygulamadır. Kullanıcı arayüzünüzün verilere erişmesi gerektiğinde BL'den erişebilir. Bu yüzden UI, sütun adından ve Veritabanı türünden (SQL Server, Oracle ..) bağımsız olacaktır. Bu şekilde kullanıcı arayüzünüz DAL'den tamamen bağımsız olacaktır. Şahsen ben "CustomerBL" gibi sınıf adını tercih, sınıf adı dilenci BL kelime kullanmayın.

Aşağıda Örnek Kod'a bakınız.

//Customer Class
class BllCustomer
{
    public int CustomerId { get; set; }
    public String Name { get; set; }
    public BllAddress Address { get; set; }

    public static BllCustomer GetByCustomerId(int id)
    {
        DataRow dr = DalCustomer.GetByCustomerId(id);
        if (dr == null)
            return null;
        BllCustomer oCust = new BllCustomer();
        oCust.CustomerId = int.Parse(dr["CustomerId"].ToString());
        //Do for other class members and load values

        return oCust;
    }
}


class DalCustomer
{

    public static DataRow GetByCustomerId(int id)
    {
        //Get Data row from Database and return Datarow
        DataRow CustomerRow = GETFROMDATABASE("SELECT * from CUSTOMER");
        return CustomerRow;
    }
}

Hata ... Bu, BLL'nizin veri tablolarınızın biçimi / yapısı hakkında bilgi sahibi olması gerektiği anlamına gelmiyor mu? ...
Paul
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.