In un'ottica POCO, non devi usare le entità generate dal designer di EF. L'autogenerazione va spenta e, come aiuto, puoi usare il template di VS che hai scaricato tramite l'Extension Manager.

Secondo questa logica, le classi dell'object model dovrebbero trovare una collocazione comune per essere utilizzate in modo trasversale unitamente agli eventuali oggetti DTO utilizzati per trasferire in modo agevole lo stato dell'applicazione (o una sua parte) attraverso i diversi layer.

Ciao, Ricky.

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it
170 messaggi dal 17 febbraio 2009
Ok, ho disabilitato l'autogenerazion del codice di EF e aggiunto il template POCO scaricato tramite Extension Manager.

Ho impostato la voce "Strategia di generazione del codice" (tra le proprietà dello schema di EF) su "Nessuna".

Fatto ciò ho creato uno schema di entità e una relazione. Compilo e EF mi genera i file "Model1.Context.tt" e "Model1.tt". All'interno di Model1.tt ho un file vb per ogni classe + un file Model1.vb.

Qui le classi sono POCO e spero di aver capito cosa intendi dire tu Riccardo.

Per quanto riguarda la "visibilità" di tale modello, su un articolo trovato online ho letto che è possibile aggiungere come collegamento allo strato BLL i file del modello. IN questo modo BLL è a conoscenza del modello, e EF può continuare a funzionare correttamente.


Se ho capito male invece, non dovrei usare completamente l'autogenerazione di EF (ma allora a che mi serve EF?? :) ) e aiutarmi il il template che ho scaricato.... ma come faccio ad aiutarmi con il template che ho scarico?? Il mio scopo è quello di avere delle comunissime classi POCO.

Riccardo, tu ti scriveresti le classi POCO di ogni entità a mano??
Quale strategia utilizzeresti per rendere visibili tali classi in tutto il progetto??

Ad ogni modo EF deve trovarsi sempre all'interno del DAL e non essere inserito in un progetto condiviso da tutta la soluzione giusto??
170 messaggi dal 17 febbraio 2009
OK, afferrato il concetto!
Continuo la lettura del testo "Domain Driven Design with C#" per approfondire meglio l'argomento e cercare quanto prima di essere in grado di implementare il caso d'uso base dell'"anagrafica prodotti" e la "distinta base" degli ordini.

Il testo, come primo esempio, struttuta la soluzione in visual studio applicando 4 progetti distinti che mappano i relativi 4 livelli presi in esame (UI, Application, Domain, Infrastructure). Sto cercando di ricondurre questi macro layer alla vostra applicazione MVC, in modo tale da ricavare un'implementazione pratica del layers presi in esame.


capisco di non poter postare domande a raffica qui sul forum :) , al momento sono talmente tante che ci vorrebbe un'intero DB per archiviarle :) , mi riservo di postare domande più specifiche nel corso dello sviluppo!

Grazie ancora!

Ciao


ps: è fattibile, una volta creato il domain model con EF, generare il database partendo dal modello?? o è ancora un feature di EF 4.0 poco matura??
170 messaggi dal 17 febbraio 2009
rickyvr ha scritto:
1)
....

2) L'uso di Facade permette di limitare le dipendenze tra strati ed è sempre consigliabile. Per il DAL userei il pattern Repository applicato con EF su un object model POCO.

....



Dunque, ho trascorso il finesettimana a leggere i primi capitoli di ".NET Domain-Driven Design with C#". Ho approfondito l'"Infrastructure Layer" che secondo il testo dovrebbe coincidere con il DAL. Sul testo di fa riferimento al Repository Pattern (Repository Factory) e all'utilizzo dell'approccio "Unit Of Work". Arrivato all'implementazione del BaseRepository che si interfaccia con SqlCE mi sono accorto che... "ovviamente"... non si fa riferimento ad entity framwork e quindi viene scritta tutta la parte di interazione con il DB. Oltre a questo, il modello "Unit of Work" mi sembra colmare le lacune che c'erano nel 2008 (anno di pubblicazione del testo) quando ancora EF non esisteva.

Detto ciò, devo focalizzarmi su quanto affermato da Riccardo, e cercare di implementare un Pattern Repository applicato con EF.

Attualmente devo creare l'"anagrafica prodotti" e la "distinta base di produzione" del gestionale in questione.

I 2 "moduli citati" devono prevedere le classiche operazioni di cancellazione, aggiornamento, selezione e ricerca dei prodotti. Sono operazioni che in un'ottica Database Driven sono una sciocchezza, ma seguendo il modello Domain Driver con "persistence ignorance" le cose si complicano un po e assumono caratteristiche diverse.



Ho notato con nell'applicazione MVC lo strato DAL e costituito interamente dal progetto "ASPItalia.ModelVirtualCasting.EntityFramework" sotto la cartella Repository. Ho capito che per risolvere il mio problema devo comprendere appieno la stuttura di questo progetto e una cosa che ho subito notato è la presenza del file "Model.Context.tt" che rapprensente il "contesto" di EF. Questo è slegato dal modello "e dal file .edmx" che invece giace nel progetto "ASPItalia.ModelVirtualCasting" ovvero il BLL dell'applicazione. Un prima domanda è... come avete fatto a slegare le 2 cose?? quando aggiungo un Entity Data Model al mio progetto in automatico mi vengono create le entità POCO (con l'utilizzo dell'apposito Template) + il file context associato. Come posso spostare il contesto in un altro progetto e mantere il modello generato con EF ancora valido?? E se faccio delle modifiche al modello (tramite l'editor di EF) il file context mi viene rigenerato nel progetto corrente e viene aggiornato quello già esistente.
(Ovviamente il context non l'avete scritto voi a mano, ma viene generato automaticamente dal file edmx giusto?)

Non vorrei aver detto sciocchezze, ma il dubbio ancora rimane!


La cartella "Wrapper" che ruolo gioca nell'applicazione?? è il punto di collegamento con i layer soprastanti?? A che server il Context Wrapper??


Ho notato che il progetto "ASPItalia.ModelVirtualCasting.EntityFramework" contiene le implementazioni delle interfacce presenti nella cartella "Common" di "Model Virtual Casting" (dovrebbe rappresentare il BLL).
Questo riferimento ad un "layer" soprastante non collide con l'architettura n-layered, dove l'n-esimo l'layer può fare riferimento ai soli layer sottostanti??
Capisco però che la soluzione permette di ragionare in termini dichiarativi, consentendo di lavora in modo parallelo conoscendo a priori i metodi e le classi che saranno implementate nei layer sottostanti.

Secondo la struttura adottata in MVC, si potrebbe affermare che il BLL è stato "fuso" con l'UI layer Web e Client ???

In fondo "ASPItalia.ModelVirtualCasting" contiene solo le interfacce e il modello.

Anche qui l'UI Layer "ASPItalia.ModelVirtualCasting.Web" contiene il riferimento a EF (DAL). Questo non va contro la classica architettura 3 layer. l'UI non dovrebbe fare riferimento soltanto al BLL ??


Scusate la mole di domande e dubbi, ringrazio molto tutti coloro che avranno la gentilezza e la pazienza di rispondermi :) !

Ciao!!
Modificato da vailfox il 28 novembre 2010 19.57 -
Modificato da vailfox il 28 novembre 2010 20.03 -
Ciao, essendomi occupato di parte dell'architettura di ModelVC in prima persona, provo a chiarire qualcuno dei tuoi dubbi.

Generazione Domain Model e Context da file .edmx
Questa parte è opera di Stefano Mostarda, magari potrà essere molto più chiaro di me. Sostanzialmente però, si tratta di disattivare la generazione automatica del codice e utilizzare due file di template, uno per le entità e uno per il context, posizionato nei rispettivi progetti. Se provi ad aprire questi file, vedrai che puntano al medesimo file .edmx, cosa che assicura la rigenerazione ogni volta che quest'ultimo viene modificato.

Cartella wrapper
ContextWrapper e ObjectSetWrapper servono ad evitare che i Repository di EF usino direttamente l'ObjectSet e l'ObjectContext di EntityFramework. Diciamo subito che a te probabilmente non te ne fregherà nulla  , in ModelVC siamo stati costretti a questo escamotage per fini di test, dato che internamente EF è piuttosto "blindato" e non è facile mockarlo.

Reference da ASPItalia.ModelVC.EntityFramework a Common
Nella mia concezione, il DAL è dove scrivi il codice che apre la connessione al database ed esegue una stored procedure. Quindi, in ModelVC, il DAL E' EntityFramework, e non il progetto che lo usa, ossia ASPItalia.ModelVirtualCasting.EntityFramework, che fa parte del layer di business. Meglio ancora, in salsa DDD, ti dico che ASPItalia.ModelVC.EntityFramework fa parte del DomainLayer e usa un servizio proveniente dall'infrastructure che è EntityFramework. Quindi nulla di strano  . Poi nella fattispecie, rappresenta una particolare implementazione (disaccoppiata) dei repository con ADO.NET Entity Framework, ma questo è un altro paio di maniche e non ha nulla a che vedere con lo strato a cui appartiene.

BLL fuso con UI
Anche qui non sono d'accordo con la conclusione a cui giungi... ASPItalia.ModelVirtualCasting, ad esempio, contiene le logiche di validazione delle entity, espresse sotto forma di metadati che la UI interpreta. Oppure espone metodi di alto livello per recuperare le ultime n news o un tot di foto di modelle a random.

Reference da Web a ASPItalia.ModelVC.EF
Pur essendo una reference lecita nel momento in cui pensi a ModelVC.EF come parte del Domain Layer (vedi sopra), in realtà lo è meno dal punto di vista del separation of concerns e della dependency injection.
E' lì per uno scopo didattico, visto che parte dell'applicazione Web è realizzata con Dynamic Data Controls, che vuole un ObjectContext di Entity Framework per funzionare. Direi che nel tuo caso puoi tranquillamente evitare di prendere in considerazione questa reference.

Ciao!
m.
170 messaggi dal 17 febbraio 2009
Grazie Marco per la spiegazione precisa e dettagliata :). Stavo giusto leggendo i tuoi 2 articoli riguardanti l'architettura interna dei repository di ModelVC.

Adesso ho le idee moolto meno confuse e il quadro inizia a diventare chiaro. Quale sarebbe un sistema semplice e basilare per fare testing sull'applicazione che sto iniziando a sviluppare??

Dato che sto utilizzando il Repository Pattern prevedo di creare anche il ContextWrapper e ObjectSetWrapper che mi consentono di avere questo ulteriore vantaggio. (Come avrete notato ho ancora poca esperienza su questo tipo di sviluppo, voglio cercare, fin da subito, di strutturare una buona (o quasi...) applicazione per avere una base solida per il futuro).


Oggi ho iniziato a scrivere una prima demo, e ho aggiunto un nuovo Entity Model (edmx) al mio progetto. Specifico, in oltre, che voglio creare un modello indipendente da ogni database (Model First). Qui crearo le mie entità (Product, Category, CategoryProperty) e genero il modello POCO tramite apposito template. Adesso vorrei crearmi un DB SQL Server Compact 3.5 per creare manualmente le tabelle che mi servono e poi mapparle sul file edmx. Bene... non ho capito come si fa :( :( .


Nell'ottica della mia applicazione sarebbe corretto creare i seguenti progetti: ??

- Application (contiene la logica di alto livello, es: metodo che restituisce un prodotto tramite l'id {ovviamente utilizzando i Repository e non EF direttamente! :) )

- EntityFramework (contiene Il Model.Context per l'accesso ai dati generato dal file edmx)

- Repository (fa riferimento al progetto EntityFramework e contiene l'implementazione delle interfacce dei repository)

- Commons (è referenziato da tutti i progetti soprastante e contiene l'object model (Classi POCO) + le interfacce dei repository. In questo modo le interfacce dei repository sono visibili a tutta la soluzione e sarebbe possibile sviluppare in modo Parallelo (lavorando magari in 2 persone).


Che ne pensate?? Marco, Riccardo ??
Sono promosso?!!
intanto che aspetti la loro risposta, leggiti anche questo così se utilizzi Include puoi farlo in maniera tipizzata che risparmia tanti errori ... in più con la piccola modifichetta che ho fatto sembra funzionare con i wrapper usati in ModelVC
ancora non ho capito come ci sono riuscito

Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna.
-Albert Einstein-

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.