2009-08-14 15 views
10

Quali sono i vantaggi/gli svantaggi dell'utilizzo di NHibernate? Che tipo di applicazioni dovrebbero essere (& non dovrebbe essere) costruito utilizzando NHibernate?Vantaggi e svantaggi di NHibernate

risposta

11

Poiché altri ppl hanno elencato i vantaggi mi limiterò a elencare gli svantaggi


Svantaggi

  1. aumentato tempo di avvio a causa della preparazione dei metadati (non va bene per le app desktop come
  2. Enorme curva di apprendimento senza sfondo orm.
  3. comparativamente Difficile per ottimizzare sql generato.
  4. Difficile ottenere la gestione delle sessioni bene se usato in ambienti non-tipici (leggi non webapps)
  5. Non adatto per le applicazioni senza un modello di oggetto di dominio pulita (non tutte le applicazioni nel mondo non avete bisogno modelli di oggetti di dominio pulite).
  6. Se si dispone di schema db (legacy) progettato in modo errato, è necessario passare da un anello all'altro.
+3

Evidenzia l'immensa curva di apprendimento come la più grande ragione per non utilizzare NHibernate in un progetto. Per tutti i loro inconvenienti, strumenti come LINQ to Sql sono significativamente più facili da utilizzare rispetto a NHibernate. Detto questo, preferirei usare NHibernate su un progetto piuttosto che con qualsiasi altro ORM grazie alla sua incredibile flessibilità. –

+0

Proprio sul punto 3, NHibernate ti consente di eseguire direttamente procedure SQL o memorizzate e ti aiuterà a tradurre i risultati nel tuo modello per quando devi veramente preoccuparti dell'SQL usato. –

+1

@Garry N + 1 seleziona e il suo cugino sopra il recupero ansioso è la rovina della maggior parte dei progetti nhinbernate. Usando straight sql si può sconfiggere l'intero punto di un ORM – Surya

1

Vantaggi:

  1. Caching
  2. Semplicità nel codice
  3. potenza
  4. Flessibilità
  5. multi-database di supporto

Svantaggi:

  1. fermate dover scrivere il proprio codice di persistenza
  2. può ridurre la vostra conoscenza di SQL

applicazioni si dovrebbe usare per:

  • Qualsiasi che utilizzano un database

A few more specific reasons to like NHibernate

+1

Non capisco perché 'Si ferma a dover scrivere il proprio codice di persistenza' è uno svantaggio. – NerdFury

+0

Ad alcune persone piace dover scrivere più codice del necessario. Era un po 'ironico. –

+0

Vorrei aggiungere: Qualsiasi che usi un database - 'ma non lo sta usando solo per la manipolazione dei dati: caricamento di migliaia di righe in memoria' – sirrocco

0

La risposta di alto livello è che NHibernate è in una classe da solo e non c'è concorrenza.

Se avete bisogno di CRUD contro un database da un'applicazione .NET, si dovrebbe utilizzare NHibernate, per almeno due motivi:

1) È possibile ottenere supporto Linq (che richiede qualcosa di simile a un ORM)

2) NHibernate è molto maturo

Non ci sono svantaggi significativi. Ci sono altre opzioni, ma quelle altre opzioni hanno svantaggi significativi.

ho scritto un po 'di più su questo qualche tempo fa:

.NET and ORM - Decisions, decisions

0

Svantaggi: NHibernate non è un prodotto Microsoft e pertanto dovrà affrontare una certa resistenza da parte di colleghi che non ne hanno sentito parlare. Specialmente bigots FOSS. La configurazione dei file di mapping e il comportamento di caricamento lazy/eager possono richiedere molto tempo. Se il tuo database ha una convenzione di denominazione bizzarra, design atipico o requisiti di prestazione molto rigidi, potrebbe essere necessario più lavoro del previsto.

Lo dico molto ma lo ActiveRecord è un ottimo livello su NHibernate. Usa gli attributi per mappare i punti dati ai membri della classe direttamente nelle classi stesse. Le persone non stanno usando questa cosa abbastanza.

3

Vantaggi:

  • Open source
  • sulla base di modelli ampiamente approvati
  • NH non è il codice-generatore :)

Svantaggi:

  • metà-fatto il supporto LINQ
  • Basse prestazioni

(vedi ad esempio le prestazioni e test di LINQ su ormbattle.net)

+1

Parlando tecnicamente, generatore di codice NH IS: legge i metadati e genera classi proxy usando LinFu o Castle DynamicProxy. Il supporto LINQ in Linq2Nhibernate sembra essere completo per quanto riguarda l'API dei criteri, quindi sì è più limitato di HQL ma è comunque molto potente e sufficiente per la maggior parte delle situazioni. Totalmente in disaccordo sulle prestazioni. – Ray

+1

D'accordo con te, è il generatore di codice di runtime, ma non il tempo di progettazione. Personalmente non mi piacciono gli strumenti, che generano tonnellate di codice in fase di progettazione. Quindi è un vantaggio di NH. Per quanto riguarda LINQ, non c'è dubbio, sono solo all'inizio della strada. –

+2

Questi benchmark non sono corretti. Vedi qui http://ayende.com/Blog/archive/2009/08/15/benchmarks-are-useless-yes-again.aspx – Ray

5

Vantaggi:

  1. flessibili e molto potenti funzionalità di mapping.
  2. Caching.
  3. Implementazione UnitOfWork molto raffinata.
  4. Richiesta futura (article).
  5. Le classi del modello sono POCO, il che significa in pratica che è possibile implementare facilmente un antipatter di dominio anemico.
  6. Interceptor - puoi fare una sorta di programmazione orientata agli aspetti ... Come molto facilmente implementando audizione, registrazione, autorizzazione, validazione, ecc. Per il tuo dominio.
  7. Lucene.NET e NHibernate sono ben integrati l'uno con l'altro - offrono un'implementazione molto rapida ed efficace dell'indicizzazione di testo completo.
  8. È molto maturo e popolare in ambiente aziendale.
  9. Grande comunità.

Svantaggi:

  1. già accennato curva di apprendimento. Puoi iniziare a utilizzare NHibernate molto velocemente, ma ci vorranno mesi per controllarlo. Consiglio vivamente di leggere il libro di Manning NHibernate.

  2. Scrivere la mappatura XML può essere molto noioso soprattutto per i grandi database con centinaia e migliaia di tabelle e viste e stored procedure.Sì, ci sono strumenti che ti aiuteranno a generare tali mappature, ma dovrai comunque svolgere un bel po 'di lavoro manuale. Fluent NHibernate sembra semplificare questo processo eliminando i mapping XML, quindi è Castle ActiveRecord (anche se è impossibile da utilizzare per il dominio anemico quando si definiscono i mapping negli attributi sulle classi del modello).

  3. Le prestazioni possono essere basse per alcuni scenari. Ad esempio grandi operazioni di rinfusa. Per quelli che potresti dover usare IStatelessSession ma la sua esperienza imbarazzante, almeno per dirlo ...

+0

Per la generazione di mapping XML , almeno considera Active Writer: http://using.castleproject.org/display/Contrib/ActiveWriter –

Problemi correlati