ciao, non conosco l'architettura di Model Virtual Casting ma dato che non hai ricevuto risposte, provo lo stesso a scrivere la mia.
JoeRuspante ha scritto:
DAL (livello 1): Mi torna una serie di IQueryable<T> (dove T è la classe relativa, Ordine/Cliente/Agente) senza eseguire alcun genere di join/filtri
Questo è ok. Hai già pensato a quale ORM utilizzare? Dai un'occhiata a Entity Framework, ti eviterà l'incombenza di sviluppare un tuo DAL. Leggi questo articolo introduttivo di Stefano Mostarda:
http://www.linqitalia.com/articoli/entity-framework/introduzione-entity-framework.aspxL'articolo che ti ho linkato è di 3 anni fa e da allora Entity Framework è stato arricchito con nuove funzionalità e con il supporto all'approccio Code First. Qui su Aspitalia trovi molti articoli, fai esperienza con questo ORM e vedrai che realizzare lo strato DAL sarà molto semplice.
JoeRuspante ha scritto:
BIZ (livello 2): Mi torna una serie di IQueryable<T> prendendo quelle del livello 1 e applicandogli i filtri necessari (es: filtro per agente come dicevo prima)
Mmh, no. Il filtro per agente, in questo caso, è logica di business che "trasuda" dal livello 2 fino alla UI e così facendo non avrai ben isolato i tre strati. Immagina che la UI non esista proprio e che l'agente possa interagire programmaticamente con il Business Layer. Devi impedirgli già lì, al livello 2, di accedere ai dati degli altri agenti dandogli come unico punto di accesso un metodo tipo GetMieiOrdini().
Il compito della UI deve essere semplicemente quello di visualizzare una struttura dati per mostrarla all'utente. Poi deve recuperare il suo input e restituire i dati modificati al livello business.
Il tipo restituito dai metodi del business layer può essere un banale IList<Ordine> oppure un IQueryable<Ordine> ma solo per consentire alla UI di ordinare, paginare e filtrare i dati. Ad ogni modo, dato che hai consultato l'applicazione Model Virtual Casting, leggi questo articolo di Cristian Civera che risponderà anche al problema che hai sollevato al punto 3.
http://blogs.aspitalia.com/ricciolo/post2690/LINQ-Lazy-Loading-Architettura.aspx JoeRuspante ha scritto:
UI (livello 3): Sfrutta gli IQueryable<T> del livello 2 ed è lui che si fa le join che gli servono (così se voglio solo l'elenco dei clienti non faccio la join con gli agenti)
Entity Framework (come anche altri ORM) ha il concetto di "lazy loading", ovvero va a caricare le entità dipendenti (come gli Ordini contenuti nella classe Cliente) solo quando ti servono, effettuando una seconda SELECT in modo assolutamente trasparente quando vai a leggere la collezione. Volendo migliorare le prestazioni, la UI può, contestualmente alla richiesta dei Clienti, richiedere anche il caricamento della sua collezione Ordini (ne viene fuori una JOIN come chiedevi tu). Questo è lo scopo dell'extension method .Include di cui si parla nell'articolo.
Quindi, ricapitolando: il livello di business prepara una query LINQ su Clienti, magari usando l'extension method .Where per filtrare per agente e poi restituisce un IQueryable (o un suo derivato) alla UI che gli accoda un .Include per richiedere il caricamento degli Ordini e, opzionalmente, altri extension methods come .Skip e .Take per la paginazione.
ciao
Modificato da BrightSoul il 18 dicembre 2011 23.54 -