2011-01-06 13 views
7

Ho il seguente livello di accesso ai dati (DAL). Mi stavo chiedendo se è impostato correttamente, o se ho bisogno di migliorarlo?Come si progetta un Data Access Layer in modo appropriato?

public class User 
{ 

} 

//Persistence methods 
static class UserDataAccess 
{ 
    UsersDAL udal = // Choose SQL or FileSystem DAL impl. 


    InsertUser(User u) 
    { 
     // Custom logic , is 'u' valid etc. 

     udal.Insert(u); 
    } 
} 

abstract class UsersDAL 
{  
    GetUserByID(); 
    InsertUser(u); 
    ... 
} 

// implementaitons of DAL 

static class UsersSQLStore : UsersDAL 
{ 

} 

static class UsersFileSystemStore : UsersDAL 
{ 

} 

ho separato lo strato di stoccaggio dalla classe utente per accedere raccolta metodi che chiamano ulteriormente qualsiasi DAL personalizzato.

L'utilizzo di static nell'implementazione DAL è corretto?

Si prega di suggerire correzioni o modi per migliorarlo. Non ho molta esperienza con la scrittura di codice a strati.

+2

Se non riesci a trovare il tempo necessario per spiegare la tua domanda (usando Pl. Invece di Please), allora come ti aspetti che qualcuno si prenda il tempo per rispondere alla tua domanda o aiutarti? –

+7

@George, non so se questo fa male a qualcuno, ma solo per salvare le persone che leggono troppo, lo uso regolarmente. Invece mi concentrai a scrivere il mio esempio. Ciò non significa che non appiazzerò il tempo delle persone e le loro risposte. –

+0

Perché dovresti farlo invece di usare un ORM come LLBLGen o Dapper? Non c'è bisogno di reinventare la ruota. –

risposta

12

Nessuna di queste classi dovrebbe essere static. Non penso che dovresti nominare le tue classi DAL, perché è un abbreviazione di Data Access Layer, e una classe in sé non è un livello (almeno nella mia mente). È possibile utilizzare invece il termine ampiamente adottato repository. Vi suggerisco di fare qualcosa di simile a quanto segue:

public class User{ 

} 

public abstract class UserRepository{ 
    public abstract void InsertUser(User user); 
} 

public class SqlUserRepository : UserRepository{ 
    public override void InsertUser(User user) 
    { 
     //Do it 
    } 
} 

public class FileSystemUserRepository : UserRepository{ 
    public override void InsertUser(User user) 
    { 
     //Do it 
    } 
} 

public class UserService{ 
    private readonly UserRepository userRepository; 

    public UserService(UserRepository userRepository){ 
     this.userRepository = userRepository; 
    } 

    public void InsertUser(User user){ 
     if(user == null) throw new ArgumentNullException("user"); 
     //other checks 
     this.userRepository.InsertUser(user); 
    } 
} 

Si noti che il UserService viene iniettato con un'istanza della classe astratta UserRepository nel suo costruttore. Puoi utilizzare un framework Dependency Injection (DI) per farlo automaticamente, come ad esempio il Castello di Windsor dal Castle Project. Permetterà di specificare una mappatura dall'astrazione (UserRepository) all'implementazione concreta (ad esempio SqlUserRepository) in un file di configurazione o nel codice.

Spero che questo ti guidi nella giusta direzione e ti chiedo se hai bisogno di ulteriori informazioni.

+0

Questo modello di modello. Sei nella giusta direzione con poche modifiche come suggerito da Hoffmann e Jani – hungryMind

+0

Grande spiegazione. Perché devo usare l'elettricità statica? Se non fosse per repository, per UserService posso renderlo statico credo? 1 altra cosa (potrebbe non essere correlata a DAL): se si tenta di inserire l'utente esistente, allora chi dovrebbe effettuare questo controllo, UserService o User class stesso tramite costruttori (poiché non conosce abt xistence quando viene aggiornato) –

+0

@Munish Goyal, non dovresti usare 'static' perché non ce n'è bisogno. Se usato in modo inappropriato, 'static' introduce uno stato non necessario nell'applicazione, il che rende sia più difficile eseguire il debug e, soprattutto, rende ** molto ** difficile da testare automaticamente. Probabilmente vorrai leggere il significato esatto di 'static' qui: http://msdn.microsoft.com/en-us/library/98f28cdx%28vs.71%29.aspx –

6

mio modesto Economia

  1. utilizzare le interfacce al posto di classe astratta se utente non ha alcuna gerarchia.
  2. Scrivere un DAL generico in modo da poterlo riutilizzare come facciata per il livello DAL.
  3. risolvere il dals di cemento da un quadro DI
Problemi correlati