Domanda

La persistenza ignoranza è in genere definita come la capacità di persistere e recuperare gli oggetti .NET standard (o pocos se proprio insistete sul dare loro un nome). E un apparentemente ben accettato definizione di un oggetto standard .NET è :

  

"... le classi ordinarie in cui ci si concentra sul problema di business a portata di mano, senza l'aggiunta di roba per motivi collegati alle infrastrutture ..."

Comunque, vedo la gente che descrivono NHibernate come un framework che permette la persistenza l'ignoranza, e tuttavia si tratta di un quadro che non può lavorare su qualsiasi di oggetti .NET di serie, solo gli oggetti .NET standard che aderiscono a particolari requisiti di progettazione, per esempio ( fonte ):

  • Tutte le classi di deve avere un costruttore di default
  • Alcune funzioni non funzionano a meno che le classi sono sigillate e tutti i membri sono virtuali
  • Oggetto identità non funziona correttamente a meno abusate Uguale / GetHashCode
  

(A parte:. Prima che qualcuno si arrabbia, non mi riferisco a prendersela con NHibernate qui, è solo un esempio spesso citato di un quadro che consenta presumibilmente la persistenza ignoranza Sono sicuro che argomenti simili potrebbero essere applicati a altri ORM che pretendono lo stesso.)

Ora, anche se la classe in sé non ha alcun attributo specifico persistenza-quadro o di classi di base, ecc, per me non è davvero "la persistenza ignoranti" perché deve seguire una serie di linee guida di progettazione per facilitare usare il framework di persistenza prescelto. È necessario progettare e implementare la classe con i requisiti del framework di persistenza in mente; se siete ignoranti di esso la classe non può funzionare con esso.

Dove Ho problemi con la definizione di "persistenza dell'ignoranza" / "POCO" è che io non vedo come, concettualmente, questo è davvero diverso per l'aggiunta di attributi quali [Serializable] o [DataContract] o [XmlType] o qualsiasi altro annotazioni-specifici persistenza-quadro che facilitano la persistenza e il recupero del soggetto utilizzando tale quadro.

Quindi, qual è esattamente "la persistenza dell'ignoranza"?

Chiaramente la definizione di come essere in grado di persistere "classi ordinarie" è un errore, perché quelli NHibernate sono normali solo in quanto non fa riferimento a specifiche classi-quadro, mentre sono straordinari in quanto richiedono scelte progettuali inusuali come impostazione predefinita costruttori e tutti i membri virtuali ed è pari implementazioni / GetHashCode sui tipi mutabili.

E 'quindi ragionevole affermare che "la persistenza l'ignoranza" è vero quando gli oggetti facilitano l'uso di un framework di persistenza (sia nel design e nella struttura o con l'uso di annotazioni specifiche per quadro) ma non fanno alcuna logica di persistenza se stessi?

È stato utile?

Soluzione

Vorrei affermare che, come la maggior parte delle cose, la sua una scala mobile. Ci sono cose che facciamo che vogliono avere la proprietà di persistenza. Su un'estremità della scala è questa cosa aventi tutte le budella, le dipendenze, e il codice che è su misura a persistere solo questa cosa nel suo modo particolare. D'altra estremità della scala è qualcosa che accade magicamente, tutto senza che noi fare molto di più che aggiungere un gettone o l'impostazione di un immobile qualche parte che fa sì che quella cosa a 'solo persistono'. Al fine di raggiungere il lato magico della scala, ci sono quadri, linee guida di progettazione, convegni, ecc che assistono la magia accade. Penso che si potrebbe sostenere che uno strumento potrebbe essere prodotta che ha avuto un minor numero di requisiti e le restrizioni di NHibernate, ma perseguito lo stesso obiettivo; tale strumento ipotetica sarebbe più avanti la nostra scala.

Non so che mi piace il termine 'ignoranza persistenza' così tanto; la sua davvero su un oggetto ignorando la realizzazione, l'archivio di backup, la cache, questo genere di cose - un oggetto è in genere consapevole di se o non è persistente, però. Ma questo è solo semantica.

Altri suggerimenti

Non credo che la vostra comprensione (o definizione) di "Persistenza Ingorance" è sbagliata.

Il reale problema è quello di astrazioni che perde . Molto semplicemente, la tecnologia esistente rende molto di difficile attuazione vera PI.

Sono d'accordo con mikeb -. "Persistenza l'ignoranza" è una scala mobile, non un vero / falso proprietà di un dato ORM

La mia definizione di vero al 100% PI sarebbe che si potrebbe persistere ogni possibile classe POCO, non importa quanto contorta e collegata ad altre classi, senza peraltro cambiare la classe in alcun modo.

L'aggiunta di campi ID, decorando con gli attributi, ereditando da classi ORM, di dover progettare le classi in modo mappano bene alle tabelle sottostanti in un RDB -. Tutto Ridurre la "punteggio PI" al di sotto del 100%

Detto questo, ho scelto di utilizzare Fluent NHibernate Automapping perché sembra avere il punteggio più alto PI di una qualsiasi delle opzioni di ORM ho guardato.

ero d'accordo con la tua definizione:

  

E 'quindi ragionevole affermare che   "La persistenza dell'ignoranza" è vero quando   oggetti facilitano l'uso di un   framework di persistenza, ma non   eseguire qualsiasi logica di persistenza   stessi?

Il codice (al contrario di atributes) nelle classi non ha caratteristiche che sono intrinseche alla persistenza. costruttori di default potrebbe essere necessaria per la persistenza, ma non hanno alcun codice che fa effettivamente la persistenza. Lo strato di persistenza potrebbe essere modificato in modo sostanziale, diverse banche dati potrebbero essere utilizzati e la logica di business rimarrebbe invariata.

Una classe ignorante persistente, è una classe che non è legata ad un quadro persistancy.

Cioè, la classe non ha assolutamente alcuna conoscenza che c'è un quadro attuale persistancy, esso non eredita da una classe che viene definita da tale quadro né implementare un'interfaccia che è richiesto per tale quadro persistenza al fine di lavorare.

Mentre ci possono essere alcune limitazioni minori che richiede un dato quadro persistenza-ignoranza, persistenza ignoranza rimane comunque in luogo.

Mentre una classe nel modello di dominio (in modo trasparente persistito con NHibernate) deve avere un costruttore senza argomenti in modo che possa essere costruito "in modo dinamico," Non è necessario avere una certa classe di base dettata dal quadro né è richiesto di avere o sostituire alcuni metodi quadro specificato.

A mio parere, "la persistenza l'ignoranza" è una proprietà del modello (modello di dominio, il modello di business o qualsiasi altra cosa si potrebbe fare riferimento ad esso come). Il modello è la persistenza ignorante perché recupera le istanze dei soggetti in esso contenuti attraverso astrazioni (a volte indicato come repository). Queste astrazioni possono essere implemened utilizzando direttamente un ORM, ma come si stato te stesso questo a volte può aggiungere requisiti per gli oggetti che non appartengono naturalmente nel vostro modello. Quindi non direi che un modello che aderisce ad alcuni requisiti di una specifica ORM è al 100% la persistenza ignorante.

è possibile implementare persisrtence ignoranza utilizzando una classe per il dominio o applicazione e una classe POCO nella persistenza, quando si sta a persistere la mappa oggetto di dominio nella tua classe di persistenza e utilizzare la persistenza degli oggetti per memorizzare con o NHibernate altro quadro

la classe di dominio deve ignorare quanto viene mantenuto le informazioni, in modo da non necessario includere tutte le regole di un framework di persistenza come (costruttore vuoto, proprietà virtuali ecc.)

queste regole framework di persistenza può essere nella classe di persistenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top