2009-05-20 7 views
55

Vedo due principali "scuole di pensiero" quando si tratta di creare applicazioni su scala aziendale su .NET (Winforms, WPF, ASP.NET).Modello di repository rispetto a oggetti aziendali "intelligenti"

Alcuni usano il "modello di repository" che utilizza un repository che sa come recuperare, inserire, aggiornare ed eliminare oggetti. Questi oggetti sono piuttosto "stupidi" in quanto non contengono necessariamente un sacco di logica - ad es. sono più o meno oggetti per il trasferimento dei dati.

L'altro campo utilizza ciò che io chiamo oggetti di business "intelligenti" che sanno come caricarsi, e in genere hanno un metodo Save(), possibilmente Update() o addirittura Delete(). Qui non hai davvero bisogno di alcun repository - gli oggetti stessi sanno come caricare e salvare se stessi.

La grande domanda è: quale uso o preferisci? E perché?

Usi lo stesso approccio in tutte le tue app o hai qualche criterio particolare per scegliere un approccio rispetto all'altro? Se è così - quali sono questi criteri?

Non sto provando a iniziare una guerra di fuoco qui - solo cercando di scoprire cosa pensano tutti di questo e qual è la tua opinione, e perché usi uno (o entrambi) schemi sull'altro.

Grazie per qualsiasi input costruttivo!

risposta

38

Uso il modello di repository a causa del principio di responsabilità singola. Non voglio che ogni singolo oggetto debba sapere come salvare, aggiornare, cancellare se stesso, quando questo può essere gestito da un singolo repository generico

+3

In tal caso, un repository generico deve sapere come caricare tutti i tipi di oggetti. –

+0

e poiché è generico può gestire il caricamento di tutti i tipi di oggetti. Semplifica anche il test delle unità –

+4

Mi piace anche lo stile di repository perché gli oggetti di trasferimento dei dati sono più flessibili. Puoi usarli ovunque, senza dipendere da framework, layer, ecc. Rappresentano semplicemente il concetto, il modello. Se vuoi un ponte tra il modello e il BD, costruisci il livello di persistenza. Vuoi un ponte tra il modello e l'utente che costruisci l'interfaccia utente. Si desidera calcolare le cose, implementare i casi d'uso, creare la logica aziendale. Tutto si riferisce semplicemente agli oggetti del modello che non sono collegati a nulla più del concetto di business stesso. – helios

15

Il modello di repository non porta a oggetti stupidi. Se gli oggetti non hanno logica al di fuori del salvataggio/aggiornamento, probabilmente stai facendo troppo al di fuori dell'oggetto.

In teoria, non si dovrebbero mai usare le proprietà per ottenere dati dal proprio oggetto, calcolare cose e reinserire i dati nell'oggetto. Questa è una pausa di incapsulamento.

Quindi gli oggetti non dovrebbero essere anemici tranne se si utilizzano oggetti DTO semplici con operazioni CRUD.

Quindi separare i problemi di persistenza dalle preoccupazioni degli oggetti è un buon modo per avere una singola responsabilità.

+0

No, certo - i miei busobj non sono del tutto "stupidi" - intendevo solo "stupidi" nel senso che non sanno come caricare e salvare se stessi - hanno altre funzionalità, ovvio :-) –

+0

Questo è sano design. Personalmente vedo "Bo sa caricare se stesso" come ragione per non assumere uno sviluppatore - e ovviamente non si è mai sentito parlare di separazione di responsabilità e mai visto un DAL adeguatamente incapsulato. – TomTom

+0

Hai usato CSLA? Ha funzionato molto bene su un progetto su cui lo abbiamo usato che comportava una distribuzione a più livelli. – Fireworks

4

Penso che l'effetto collaterale più importante dell'utilizzo del modello di deposito rispetto al modello ActiveRecord sia il test e l'estensibilità.

Senza che l'oggetto ActiveRecord contenga un repository stesso, come si isolerebbe il recupero dei dati nei casi di test? Non puoi davvero fingere o deriderlo facilmente.

Oltre a testare sarebbe anche molto più difficile scambiare le tecnologie di accesso ai dati, ad esempio da Linq-to-SQL a NHibernate o EntityFramework (anche se ciò non accade spesso).

1

E 'davvero dipende dalle esigenze dell'applicazione, ma quando si tratta di un modello di business complesso, preferisco ActiveRecord.Posso incapsulare (e testare) la logica aziendale in un unico posto.

La maggior parte degli ORM (EF, nHibernate, ecc.) Funge da repository. Molte persone considerano un livello in cima a un ORM che incapsula tutte le interazioni di dati come un repository, che ritengo non corretto. Secondo Martin Fowler, un repository incapsula l'accesso ai dati come una raccolta. Pertanto, disporre di metodi individuali per il recupero/la mutazione di dati potrebbe utilizzare un Data Mapper o un oggetto di accesso ai dati.

Utilizzando ActiveRecord, mi piace avere una classe di base "Entity". Di solito uso un ORM (repository) con questa classe base, quindi tutte le mie entità hanno metodi GetById, AsQueryable, Save ed Delete.

Se utilizzo una architettura orientata ai servizi, utilizzerò un repository (quello che maschera l'accesso diretto ai dati o un ORM) e lo chiamiamo direttamente nei miei servizi.

Problemi correlati