Sto costruendo un'applicazione piuttosto grande (web) in cui sto utilizzando Entity Framework per comunicare con il database.
La mia soluzione è impostata a strati in questo modo:
- Client
- Sito web (applicazione Web MVC)
- Server
- BusinessLogic (contiene, beh, business logic. C'è un lotto di regole aziendali coinvolte in questo progetto)
- Repository (contiene classi di repository per interrogare il database usando EF)
- Interfacce (interfacce per la definizione delle classi di repository, ovvero
IFirmRepository
) - Modello (contiene il mio file edmx, visualizza modelli, enumerazioni ecc.)
Quindi, il client / UI conosce il livello della business logic in cui le classi di business necessarie per una determinata vista vengono iniettate nei controller MVC. Il livello della logica aziendale conosce le interfacce e il modello e il repository implementa le interfacce.
In sviluppo da un'ultima settimana con questo approccio, ho la sensazione che non sia del tutto "corretto" poiché:
- Le classi di repository diventano ingombranti con molti metodi in cui ho bisogno di utilizzare il metodo
Include()
per poter lavorare con le entità disconnesse nel mio livello di logica aziendale - Per ogni query, sto utilizzando un nuovo contesto:
using(var ctx = new MyContext())
e un singolo metodo di business logic potrebbe chiamare più di un metodo di repository che rende N numero di nuovo MyContext () che non è l'ideale, immagino ? - In relazione a quanto sopra: ho letto di avere un contesto per ogni richiesta http è la strada da percorrere quando si tratta di siti web, che il mio approccio sembra "violare"?
- A parte la curiosità, ho provato a utilizzare semplicemente
MyContext
direttamente in una classe di business logic, rendendo necessaria la query per gli oggetti e quindi eseguendo la logica di business. Facendo ciò è stato molto semplice e facile e il repository sembra molto più utile del necessario e quasi ridondante.
Quindi, suppongo che diversi progetti abbiano bisogno di approcci diversi per quanto riguarda l'architettura, ma prima di cancellare completamente il mio repository e utilizzare il contesto della struttura dell'entità direttamente nelle mie classi di business logic, mi piacerebbe la tua opinione su questo. Sembra piuttosto sbagliato (nel senso che sto violando qualcosa) per graffiare il repository, ma d'altra parte, è così semplice fare semplicemente la magia senza prima definire il metodo in un'interfaccia, quindi implementarlo come repository e quindi fai uso di esso in una classe di business logic.
Quindi, qual è la tua opinione su questo? :-) Sono completamente fuori registro qui, o?
Grazie in anticipo.