Ero curioso di sapere quali sono le opinioni della gente su come mantenere l'ID di un'entità DAL come una proprietà dell'entità di dominio, al massimo una proprietà di sola lettura.Identità di persistenza e entità modello di dominio
Il mio primo pensiero è che va bene, ma più ci penso e più non mi piace l'idea. Dopotutto, il modello di dominio dovrebbe essere completamente inconsapevole del modo in cui i dati vengono mantenuti, e la conservazione e la proprietà Id su ciascun modello di dominio è un'indicazione meno che sottile. Il livello di persistenza può essere qualcosa che non richiede chiavi primarie, o un'altra proprietà esposta nel modello di dominio può essere un candidato adatto per l'identificazione, un modello no. Forse.
Ma poi questo mi ha fatto pensare, per i modelli di dominio che non dispongono di un mezzo affidabile per identificare in modo univoco una voce in un livello di persistenza del database, come devono identificare le voci quando si tratta di aggiornamento o eliminazione?
Un dizionario basato su chiavi di riferimento deboli potrebbe fare il trucco; WeakDictionary<DomainEntity, PrimaryKeyType>
. Questo dizionario sarebbe una parte dell'implementazione del repository, ogni volta che il client del repository Fetch's una raccolta di DomainEntity
un riferimento debole all'entità e il relativo ID del livello di persistenza viene memorizzato in questo dizionario interno tale che quando arriva il momento di restituire la modifica entità al repository per l'aggiornamento del livello di persistenza, il seguente potrebbe essere fatto per recuperare l'Id
PrimaryKeyType id = default(PrimaryKeyType);
if (!weakDictionary.TryGetValue(someDomainEntity, out id))
// id not found, throw exception? custom or otherwise..
// id found, continue happily mapping domain model back to data model.
I vantaggi di questo approccio come la vedo io, è l'entità del dominio non deve mantenere la sua specifica id strato di persistenza e il repository ti obbliga ad avere un'entità di dominio legittima ottenuta tramite alcune chiamate a un metodo Fetch...
o al metodo Add/CreateNew
, e Se dovessi provare ad aggiornare/eliminare l'entità, genererebbe un'eccezione.
Sono consapevole del fatto che probabilmente si tratta di un eccesso di ingegnerizzazione e dovrei limitarmi a diventare pragmatico, ero solo curioso di sapere cosa ne pensavano gli altri.
Non voglio iniziare un'altra discussione solo per questa domanda secondaria in quanto è in qualche modo correlata. Ma dal momento che è relativamente recente ho iniziato a cercare in DDD (anche se in questo caso il mio database è venuto prima) Mi chiedevo se potessi confermare di avere la mentalità giusta per le entità di dominio, ecco un esempio ridotto della mia entità di dominio Employee.
public class Employee : DomainEntity
{
public string FirstName { get; }
public string LastName { get; }
public UserGroup Group { get; }
// etc..
// only construct valid employees
public Employee(string firstName, string lastName, SecureString password, UserGroup group);
// validate, update. (not sure about this one.. pulled it
// from an open source project, I think that names should be able to be set individually).
AssignName(string firstName, string lastName);
// validate, update.
ResetPassword(SecureString oldPassword, SecureString newPassword);
// etc..
}
Grazie!
Si dovrebbe ridurre un po 'il verbage e porre una domanda _real_ (non una discussione) se si desidera rispondere a questa domanda (e rimanere aperta) – Shoe
@ShoeMay: Non sono d'accordo. Questa è una domanda pertinente e ben strutturata. I concetti di implementazione del DDD sono spesso pesantemente appesantiti da domande di progettazione come questa. – davenewza