Domanda

Negli ultimi giorni ho fatto un sacco di ricerca utilizzando l'approccio DAL / BLL / UI senza una chiara comprensione di come essa si applica al mio progetto. In passato, ho lasciato il mio BLL collegamento interfaccia utente direttamente al Data Access Layer (LinqToSql dbml). Ma, non credo che questa è una buona idea dove lavoro ora (o forse anche in passato), perché abbiamo un sacco di applicazioni diverse e vorrei utilizzare lo stesso DAL / BLL come sono costruite.

La mia domanda è: come fa l'aiuto BLL me quando, nella maggior parte delle mie applicazioni, tutto quello che veramente fare è utilizzare il LinqtoSqlDataSource / GridView per collegare al mio DataContext di prendersi cura di tutto l'aggiornamento / modifica, ecc Inoltre, ogni nuova applicazione web sarà, a un certo livello, richiedere modifiche unici al DAL / BLL per ottenere il richiedono di dati, possibilmente che interessano altre applicazioni che utilizzano lo stesso DAL / BLL. E 'questo il riutilizzo del DAL / BLL il modo giusto di fare questo o mi sto perdendo qualcosa?

Credo che la BLL arriva quando ho bisogno di costruire, per esempio, una classe di sicurezza per le varie applicazioni web che saranno costruite. Ma, quando uso il Linqtosqldatasource, perché dovrei preoccuparsi di collegarlo al BLL?

DAL

  • LinqToSQL dbml DataContext.
  • non utilizza cambiamento LinqToSQL come dovrei usare questo disegno?

BLL

  • Sicurezza per vari sito utilizzato dalla società.
  • Query DAL ritorno cosa (?) Quando si utilizza LinqToSQLDatSource., Funzioni che gestiscono i vari risultati set (sono davvero sicuro di come questo dovrebbe funzionare con BLL, mi dispiace se la questione non è chiara)

UI

  • di riferimento solo la BLL?
È stato utile?

Soluzione

Il DAL e BLL sono separati da una differenza spesso sottile, ma chiave; logica di business. Suoni stupidamente semplice, ma mi permetta di spiegare ulteriormente perché le distinzioni possono essere molto fine e tuttavia l'architettura impatto in modi enormi.

Utilizzando Linq2SQL, il quadro genera oggetti molto semplici che rappresentano ciascuno un record in una tabella. Questi oggetti sono DTOS; sono lightwight, POCO (Plain Ol' CLR Object) classi che hanno solo i campi. Il quadro Linq2SQL sa come creare un'istanza e idratare questi oggetti dai dati DB, e allo stesso modo si può digerire i dati contenuti in uno nella SQLDML che crea o aggiorna il record DB. Tuttavia, poche o nessuna delle regole che disciplinano il rapporto tra i campi di vari oggetti sono noti a questo livello.

Il vostro modello di dominio reale dovrebbe essere più intelligente di questo; almeno abbastanza intelligente per sapere che una proprietà su un oggetto Order nome SubTotal dovrebbe essere pari alla somma di tutti i ExtendedCosts di tutti OrderLines, e allo stesso modo, ExtendedCost dovrebbe essere il prodotto della PrezzoUnitario e quantità. In molti programmi moderni, il dominio fa parte del vostro BLL, almeno fino a questo punto. Gli oggetti creati da Linq2SQL probabilmente non devono sapere tutto questo, soprattutto se non si persisti SubTotal o ExtendedCost. Se ci si basa sul Linq2SQL DTOs, hai praticamente da soli legato a quello che è chiamato un anemico Domain Model, che è un anti-modello noto. Se l'oggetto del dominio non può tenere per sé internamente coerenti, almeno, allora qualsiasi oggetto che funziona con l'oggetto di dominio devono essere di fiducia per mantenere in questo modo, che richiedono tutti quegli oggetti di conoscere le regole che non dovrebbero.

L'interfaccia utente dovrebbe conoscere il dominio, o se si preferisce si dovrebbe sapere qualche modo astratto per ottenere i dati dal dominio per scopi di lettura-scrittura (generalmente incapsulati in oggetti chiamati controllori, che funzionano con lo strato di dominio e / o Linq2SQL). L'interfaccia utente non avrebbe dovuto sapere sul DB in qualsiasi programma di medie dimensioni o più grande; entrambi gli oggetti di dominio potranno idratare con un riferimento agli oggetti nel DAL, o sono prodotti da oggetti personalizzati nel DAL che si crea a fare l'idratazione, che vengono poi affidati al controllore. Il modello ADO connesse ed interoperabilità con GridView è ammirevole, ma non consente di astrazione. Diciamo che si voleva inserire un livello di servizio web tra il dominio e interfaccia utente, per consentire l'interfaccia utente per essere collocata su un app mobile che ha lavorato con i dati in vostro magazzino. Avresti per ricostruire la vostra interfaccia utente, in quanto non è più possibile ottenere gli oggetti da Linq2SQL direttamente; li ottiene dal servizio web. Se si ha un livello di controllo che ha parlato Linq2SQL, si potrebbe sostituire quello strato con i controllori che hanno parlato ai servizi web. Sembra una piccola differenza; si ha sempre di cambiare qualcosa. Ma, ora che si sta utilizzando esattamente la stessa interfaccia utente per le applicazioni mobili e desktop, quindi le modifiche a quel livello non devono essere fatte due volte solo perché i due strati di ottenere i dati modi diversi.

Altri suggerimenti

Questa è una grande domanda che mi è stato rimuginando con la nostra app catalogo per un anno. Una specifica istanza per me potrebbe aiutare con il modello.

Ho una pagina per visualizzare i contenuti di un carrello della spesa. Negli primi giorni di questa pagina ha avuto una griglia popolata dai risultati di una stored procedure di SQL che, dato il numero d'ordine, elencati gli elementi presenti nel carrello.

Ora ho un 'carrello' oggetto BLL che contiene una raccolta di oggetti 'riga'. La griglia è lo stesso, ma la fonte dei dati è righe del carrello.

Perché faccio questo? Inizialmente, non Becuase di eventuali modelli fantasia di progettazione. Ho avuto così tanti casi speciali da gestire sulla base di campi in ogni riga e ho avuto altri posti avevo bisogno di mostrare gli stessi carrello-contenuto dei dati, è solo più senso per costruire gli oggetti. Ora un carrello carichi da un repository e le mie pagine non hanno alcuna idea di che cosa repository fa. Heck, per il test, è dati hard-coded carrello.

Il carretto quindi utilizza un repository per caricare le righe. Ogni fila ha una logica per maniuplate sé, senza sapere dove i dati provenienti da.

Si spera che aiuta?

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