Separazione del recupero di dati e oggetti di business tra i livelli DAL e BLL

9

Ho fatto qualche ricerca prima di pubblicare questa domanda. Tra le altre domande o posta, una di queste è fornita di seguito. Non riuscivo a capire come determinare ...

Business Objects all'interno di un livello di accesso ai dati

Ho un repository e Business Layers chiamano il repository per recuperare i dati. Ad esempio, supponiamo di avere le seguenti classi per BLL e DAL:

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; }
}

Se il BLL vuole recuperare un oggetto Cliente, chiamerà GetCustomerById (customerId) in DAL.

Le seguenti sono le mie preoccupazioni Non ho potuto avere una mente chiara:

  1. Non riesco a vedere come determinare quale oggetto deve essere restituito da GetCustomerById in DAL? Dovrebbe restituire BllCustomer o DalCustomer?

  2. Dove dovrebbe essere il recupero (e / o la conversione in oggetto Business) dell'indirizzo associato al cliente?

Se il DAL restituisce gli oggetti Dal, la logica per recuperare e compilare l'indirizzo può essere solo nella BLL. Se il DAL restituisce oggetti BLL, la logica per recuperare e compilare l'indirizzo può essere nel BLL o nel DAL. Attualmente il DAL restituisce i Business Objects e la logica per riempirla è nel DAL.

Da quello che ho letto, immagino che non ci sia giusto o sbagliato. Dal link incluso sopra, ci sono persone che dicono in un modo e gli altri stanno dicendo nell'altro modo. Ma come faccio a determinare quale potrebbe funzionare meglio per il mio caso?

Qualsiasi aiuto sarebbe apprezzato.

    
posta ShamirDaj 01.11.2014 - 05:29
fonte

4 risposte

5

I cannot see how to determine what object the GetCustomerById in DAL should return? Should it return BllCustomer or DalCustomer?

Dovrebbe restituire un oggetto DalCustomer , la restituzione di un oggetto BllCustomer interromperà principio di responsabilità singola . È possibile visualizzare l'oggetto DalCustomer come interfaccia o contratto utilizzato dal livello aziendale (o dal consumatore). In effetti se restituiva un BllCustomer il DAL avrebbe dovuto soddisfare ogni oggetto del livello aziendale che lo chiama o potenzialmente potrebbe chiamarlo.

Where should be the retrieving (and/or converting to Business object) of the address associated with the customer?

La conversione deve essere eseguita in un modello di visualizzazione o manager. È necessario disporre di un intermediario per chiamare il proprio servizio o componente di accesso ai dati. Se senti di averne bisogno puoi avere una conversione nel tuo oggetto BllCustomer . Tuttavia, quando si scambia il DAL da MSSQL a Oracle, ad esempio l'oggetto (o l'interfaccia) restituito deve rimanere invariato.

Preferibilmente il tuo livello aziendale dovrebbe anche essere indipendente dal tuo livello dati. Il Business Layer è responsabile delle tue regole di business. È qui che dovrai aggiungere le convalide utilizzando un framework di convalida per applicare le tue regole aziendali.

    
risposta data 06.10.2016 - 15:06
fonte
3

In genere, il DAL non ha alcuna conoscenza del BLL. Pensaci in questo modo, un'applicazione diversa con un BLL diverso potrebbe utilizzare lo stesso DAL. Un'applicazione / modulo Payables e un'app Receivables per la stessa azienda condividono i dati (clienti, addebiti, pagamenti, ecc.). Cercare di avere una DLL in possesso di più di una BLL sarebbe molto difficile e non necessaria. Ciò consentirebbe anche di modificare l'archiviazione dei dati senza alcun impatto sul BLL (purché non si interrompano le interfacce).

Ora puoi passare un oggetto DAL al BLL oppure potresti creare un terzo set di oggetti: Entity. Questi conterrebbero solo i valori da trasmettere insieme. Il DAL farebbe riferimento all'entità e interagire con il tuo archivio / database e il BLL gestirà tutta la logica e farà riferimento al DAL.

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
}
    
risposta data 01.11.2014 - 14:04
fonte
3

Il tuo repository dovrebbe restituire il BLL o l'oggetto del dominio. è probabile che non sia necessario un oggetto DAL.

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"]);
    }
}
    
risposta data 27.10.2015 - 22:56
fonte
-1

DAL dovrebbe essere indipendente da BL e BL dipendenti da DAL. L'interfaccia utente dovrebbe solo accedere ai dati tramite BL. È buona norma se si restituisce DataTable o DataRow da DAL e quindi Converti DataTable / DataRow in oggetti BL. Quando l'interfaccia utente deve accedere ai dati a cui può accedere da BL. Quindi l'interfaccia utente sarà indipendente dal nome della colonna e dal tipo di database (SQL Server, Oracle ..). In questo modo la tua interfaccia utente sarà totalmente indipendente da DAL. Personalmente preferisco il nome di classe come "CustomerBL", Non usare la parola BL nell'accattonaggio del nome della classe.

vedi sotto Codice di esempio.

//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;
    }
}
    
risposta data 28.10.2015 - 18:21
fonte

Leggi altre domande sui tag