Per la scorsa settimana ho tentato di scrivere un progetto proof-of-concept usando dependency injection, un livello di servizio, unità di pattern pattern + repository.
Sto cercando di progettare qualcosa che possa essere facilmente utilizzato da qualsiasi tipo di applicazione, sia che si tratti di un'applicazione desktop Windows, un'applicazione CLI, un'applicazione ASP.NET MVC, persino un'applicazione iOS con Mono. Per favore, tieni presente che questo è solo per un proof-of-concept.
Fino ad ora, ho scritto
- Unità di lavoro + Unità di lavoro fabbrica per NHibernate e Entity Framework (2 framework OR / M per .NET)
- (generico) repository. Esiste un repository per implementazione OR / M, che considera la rispettiva Unit of Work Factory come parametro costruttore. Ha bisogno di questo per afferrare l'attuale unità di lavoro (dal momento che la sua implementazione contiene le cose necessarie per far funzionare ogni framework OR / M)
Questo ha raggiunto:
- Posso sostituire le implementazioni del repository e la fabbrica di Unità di lavoro con NHibernate e Entity Framework e funzionerà. Questo è buono, tranne che non ho ancora implementato una vera applicazione, solo unit test.
Questi sono i problemi / sfide che sto affrontando:
-
Ogni tipo di applicazione (desktop, CLI, ASP.NET MVC, iOS, Android, qualsiasi cosa) non definisce un'unità di lavoro allo stesso modo. Un'applicazione desktop (AFAIK) dovrebbe avere una unità di lavoro per schermo - un'applicazione Web dovrebbe avere una unità di lavoro per richiesta, ecc. Non so come condividere una singola unità di lavoro con tutti i repository / servizi ( vedi sotto) che ne ha bisogno.- Michael ha ragione. - Voglio che tutta la mia logica risieda in un livello di servizio. Il livello di servizio decide quando deve impegnarsi un'unità di lavoro. L'idea è che chiunque chiami il servizio, sappia cosa passare e sappia cosa aspettarsi come risultato. Se qualcosa va storto, il servizio lo registra. Se dovessi farlo in base alle singole applicazioni, DRY sarebbe stato violato (giusto?).
Sembra che se dovessi implementare questo progetto totalmente separato, la quantità di codice che dovevo riutilizzare non sarebbe tanto quanto la quantità di codice che avrei dovuto scrivere per implementarlo in ogni tipo di applicazione, che, alla fine, molto probabilmente colerebbe il mio contenitore IoC nell'applicazione.
Sono davvero pazzo per aver tentato anche questo?
EDIT: il problema reale che sto affrontando sta fornendo il mio livello di servizio e repository con la stessa istanza di un'unità di lavoro, indipendentemente dal tipo di applicazione utilizzato.