Architettura di applicazioni, logica e database a 3 livelli

1

(Nota: gli esempi sono semplificati)

Ho separato la mia soluzione in 3 progetti

  • sito web
  • Business Logic
  • Logica dell'accesso ai dati

Il sito web ha accesso a BL e DAL
Il BL non ha accesso a nulla
Il DAL ha accesso al BL

Sul sito web posso fare qualcosa di simile

BL.User user = DAL.GetUser(1)

Ho anche questo tipo di logica nel sito web

user = [new user information]

If Not DAL.DoesEmailExists(user) Then
    DAL.InsertNewUser(user)
End If

Quale sarebbe la mia opzione per rimuovere questo if / insert dal sito web?
La mia opzione ideale sarebbe quella di inserire questa logica all'interno di BL.User ma ciò non è possibile. Se BL ha accesso al DAL, farà un riferimento circolare.

    
posta the_lotus 11.03.2013 - 21:04
fonte

2 risposte

2

Questo tipo di codice appartiene effettivamente al Business Layer, da cui controlli il comportamento della tua applicazione, prendi decisioni sull'inserimento di un oggetto o sulla visualizzazione di un avviso per l'utente, ecc.,

// BL
If Not DAL.Exists(user) Then
    DAL.InsertNewUser(user)
Else
    // Maybe warn the user about inserting a duplicate user object
    WL.Alert("User already exists!") 
End If

Quindi BL dovrebbe avere accesso sia al DAL che al WL e il tuo DAL non dovrebbe avere una dipendenza dal BL (sa solo come recuperare i dati su richiesta). Non confondere un Business Object (BO), che può essere anche un oggetto Data Transfer (DTO), con un BL: a BO è semplicemente per trasferire o trasferire dati da un livello all'altro.

    
risposta data 11.03.2013 - 22:14
fonte
2

Presumo i suoi webform ASP.NET, passa attraverso Building Layered Applications serie di Imar Spaanjaars che spiega lo stesso concetto che hai descritto. In breve, di seguito è l'approccio.

Presentation Layer

Da aspx.cs:

var objCustomer = CustomerBLL.GetCustomerById(id);
if(objCustomer != null)
{
  //assign values to UI controls
}

In Business Logic Layer

public static class CustomerBLL
{
  public static Customer GetCustomerById(int id)
  {
    //call database layer
    return CustomerDAL.GetCustomerById(id);
  }
}

In livello di accesso ai dati

public static class CustomerDAL
{
  public static Customer GetCustomerById(int id)
  {
    Customer objCustomer = new Customer();
    //use ADO.NET or any data access methodology to retrieve data
    //and assign properties of objCustomer
    return objCustomer;
  }
}

Oggetti business

Questi sono solo DTO usati per passare i dati tra i livelli. Viene referenziato sia in Business Logic che in Data Access Layer.

public class Customer
{
   public string Name {get;set;}
  //other properties
}

IMO, funziona bene con applicazioni di piccole e medie dimensioni.

Modifica

A seconda del codice, entrambi i livelli DAL e BLL vengono richiamati dal livello di presentazione. Quindi non c'è una risposta giusta, a meno che non conosciamo la responsabilità di ogni livello e di come è progettato.

On the website I can do something like

BL.User user = DAL.GetUser(1)

I also have this type of logic in the website

user = [new user information]

If Not DAL.DoesEmailExists(user) Then
    DAL.InsertNewUser(user)
End If

Dal codice esistente, come menzionato nella sezione dei commenti, prova in questo modo:

Sito web

DAL.UpsertUser(objUser);

In store proc:

IF EXISTS(select 1 FROM users where userid = @userid)
BEGIN
    --insert
END
ELSE
BEGIN
   --update
END
}

Funziona sia per inserimento / aggiornamento.

    
risposta data 11.03.2013 - 21:37
fonte

Leggi altre domande sui tag