GUI, BLL, DAL Organizzazione in un progetto

9

Sto leggendo sui livelli dell'applicazione e voglio usare questo disegno nel mio prossimo progetto (c #, .Net). Alcune domande:

  1. La separazione dei livelli avviene attraverso i namespace? Project.BLL.Whatever, Project.DAL.Whatever

  2. È più appropriato separare per layer, quindi componenti (Project.BLL.Component1), o per componenti, quindi layers (Project.Component1.BLL)

  3. Per il mio DAL, questo livello è ulteriormente organizzato utilizzando classi diverse? Se tutte le chiamate al database sono inserite in una singola classe, non esiste alcuna organizzazione. Sarebbe meglio suddividerle con classi o spazi dei nomi diversi?

  4. Le classi DAL sono in genere statiche? Sembra complicato istanziare un oggetto DAL prima di chiamare ogni volta uno dei suoi metodi.

Qualsiasi altro suggerimento per fare le cose nel modo corretto con questi strati sarebbe apprezzato.

    
posta sooprise 10.06.2011 - 17:58
fonte

2 risposte

8
  1. Sì. E anche assemblee.
  2. Separerei per livelli, quindi componenti.
  3. Sì. Ci sono diversi approcci a questo, ma avrei un IDatabaseService (che riassume i vari modi in cui viene chiamato il database - questo può quasi essere un mapping diretto di ExecuteScalar / ExecuteNonQuery / ExecuteReader), e quindi varie classi di accesso ai dati che partizionano per tipo di dati. Ad esempio, potresti avere una classe UserDataAccess che avrebbe semplici metodi CRUD che creano / modificano / cancellano oggetti utente. Un altro approccio potrebbe essere quello di avere un oggetto Utente con CRUD integrato.
  4. No. Ciò rende molto più difficile da testare unitamente. Dovresti usare iniezione di dipendenza per passare le dipendenze al costruttore di ogni classe di accesso ai dati (come un IDatabaseService). Dovresti quindi passare gli oggetti di accesso ai dati negli oggetti di business, in questo modo:

    BusinessObject businessObject = new BusinessObject (new DataAccessObject (new DatabaseService ())); businessObject.PerformOperation ();

Ogni oggetto business può aver bisogno di più oggetti di accesso ai dati. Il tuo codice GUI userebbe anche uno o più oggetti di business. Alcuni oggetti business potrebbero non richiedere alcun oggetto di accesso ai dati, ma non dovrebbero mai utilizzare direttamente IDatabaseService.

    
risposta data 10.06.2011 - 18:04
fonte
2

Per le domande 1 e 2 vai con le risposte di Matteo.

Ho impiegato molto tempo a cercare di capire il modo migliore per strutturare il DAL delle applicazioni desktop. E il modo migliore dipende in realtà dalle esigenze dell'applicazione. In una delle mie app mi sono imbattuto in una classe DA per ogni tabella di database, che si è registrata con una classe DataProvider centrale (cioè singleton) e ha gestito il CRUD. Ciascuna classe DA può quindi decidere se desidera memorizzare nella cache tutti i dati della tabella nella RAM o meno (prestazioni!) E / o se è necessario avere la capacità di attivare gli aggiornamenti automatici dei client in altri client in esecuzione su altri computer (si pensi multiutente concorrenza). Ciò semplifica l'aggiunta di nuove classi DAL, poiché tutto ciò che devono fare è conformarsi all'interfaccia di registrazione.

Non tutti i DAL hanno bisogno di questo tipo di funzionalità, ma ho appreso che l'approccio stesso (cioè fornitore di dati singleton e semplici classi DAL con registrazione statica) mi ha reso la vita molto più semplice quando ho iniziato ad aggiungere nuove classi.

Non raccomanderei assolutamente di costruire il CRUD nelle classi di livello superiore, a meno che non si tratti di un'applicazione molto semplice. Il DAL è un'astrazione della memorizzazione dei dati. Se decidi di cambiare l'archiviazione dei dati in futuro (anche se è solo per usare MySQL invece di MS SQL), sarai molto grato per questo. Inoltre: gli oggetti BLL dovrebbero essere strutturati in base alle loro relazioni logiche di business. Gli oggetti DAL sono strutturati dai tipi di contenitori di memoria che rappresentano. Le differenze possono essere drammatiche.

Fai NON rendere statiche le tue classi DAL. Ciò che guadagni in velocità di codifica perderà molte volte in testabilità e flessibilità.

    
risposta data 10.06.2011 - 18:25
fonte

Leggi altre domande sui tag