Domanda

Io sono nel mezzo di una "discussione" con un collega circa il modo migliore per implementare il livello di dati in una nuova applicazione.

Un punto di vista è che lo strato di dati dovrebbe essere a conoscenza di business objects (nostre classi che rappresentano un'entità), e di essere in grado di lavorare con l'oggetto in modo nativo.

L'avversaria punto di vista è che lo strato di dati dovrebbe essere oggetto agnostico, e puramente gestire semplici tipi di dati (stringhe, bools, date, etc.)

Vedo che entrambi gli approcci possono essere validi, ma il mio punto di vista è che io preferisco la prima.In questo modo, se il supporto di memorizzazione di modifiche, il livello aziendale non (necessariamente) devono cambiare per accogliere il nuovo strato di dati.Pertanto, sarebbe una cosa banale per passare da un archivio di dati SQL per serializzato xml filesystem store.

Il mio collega punto di vista è che lo strato di dati non sono tenuti a conoscere le definizioni di oggetto, e che, come lungo come i dati vengono passati circa in modo appropriato, che è abbastanza.

Ora, so che questa è una di quelle domande che ha il potenziale per iniziare una guerra di religione, ma mi farebbe piacere qualche feedback da parte della comunità su come ci si avvicina a queste cose.

TIA

È stato utile?

Soluzione

E ' davvero dipende dalla tua visione del mondo - ho usato per essere in disgiunti camp.DAL era lì solo per la fornitura di dati per la BAL - fine della storia.

Con tecnologie emergenti, come Linq to SQL e Entity Framework diventando un po 'più popolare, quindi la linea tra DAL e BAL sono stati offuscata un po'.In L2S soprattutto il DAL è strettamente accoppiato al Business objects come il modello a oggetti è un 1-1 mappatura per il vostro campo di database.

Come nulla nello sviluppo di software, non c'è una risposta giusta o sbagliata.È necessario capire le vostre esigenze e future condizioni e lavorare da lì.Io non uso una Ferrari sul Dakhar rally come una Range Rover su un giorno in pista.

Altri suggerimenti

Si possono avere entrambi.Lasciate che il livello di dati non conosco il tuo bussiness oggetti e renderlo in grado di lavorare con più di un tipo di dati di fonti.Se si fornisce un'interfaccia comune (o una classe astratta) per interagire con i dati, si possono avere diverse implementazioni per ogni tipo di origine dati.Modello Factory va bene qui.

Un ottimo libro che ho, che tratta questo argomento, è I Dati Dei Modelli Di Accesso, da Clifton Cocca.Ha molte buone spiegazioni e le buone idee su come separare il vostro business strato di strato di persistenza.Si dovrebbe davvero provare.E ' uno dei miei libri preferiti.

Jeffrey Palermo ha scritto un post su questo.L'ha chiamato Cipolla Architettura.

Un trucco che ho trovato utile è di avere il mio livello di dati essere "raccolta " agnostico".Che è, ogni volta che desidera restituire un elenco di oggetti dal mio livello di dati, ho il chiamante di passare nell'elenco.Così, invece di questo:

public IList<Foo> GetFoosById(int id) { ... }

Faccio questo:

public void GetFoosById(IList<Foo> foos, int id) { ... }

Questo mi permette di passare in un semplice Elenco, se ho bisogno, o più intelligente di attuazione di IList<T> (come ObservableCollection<T>) se ho intenzione di associare dall'interfaccia utente.Anche questa tecnica mi permette di restituire la roba dal metodo come un ValidationResult contenente un messaggio di errore se si è verificato.

Questo significa che il mio livello di dati conosce il mio oggetto di definizioni, ma mi dà un ulteriore grado di flessibilità.

Check out Linq to SQL, se io fossi la creazione di una nuova applicazione adesso vorrei prendere in considerazione di affidarsi interamente Linq base di dati di livello.

Più che altro credo sia una buona pratica per de-coppia di dati e la logica, per quanto possibile, ma non è sempre pratico.Un puro separazione tra la logica e i dati di accesso ti unisce e ottimizzazioni difficile, che è ciò che rende Linq così potente.

In applicazioni in cui è possibile utilizzare NHibernate, la risposta diventa "da qualche parte in mezzo", nel senso che, mentre il mapping XML definizioni (specificare la tabella a cui appartiene l'oggetto e le colonne che fanno parte di campo, ecc) sono chiaramente nell'oggetto business tier.

Sono passato a un generico dati del gestore di sessione che non è a conoscenza di tutti gli oggetti di business;l'unico requisito è che il business degli oggetti passati per le operazioni CRUD avere un file di mapping.

Vecchio post, ma la ricerca di informazioni simili mi sono imbattuto in questo il che spiega bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top