Domanda

Sto cercando di fare le cose nel modo DDD (domain driven design). E ragazzo faccio fatica. In tutti i libri che ho letto, l'autenticazione non è preoccupante e non menzionata!

Ho scritto il mio servizio di autenticazione e iscrizione che è responsabile della registrazione e dell'accesso degli utenti, della creazione di password salate, ecc. Non utilizzo il provider di appartenenze di .NET ma faccio affidamento sull'autenticazione dei moduli.

Ho implementato un modello utente che contiene Username, E-Mail, PasswordHash, ApprovalStatus ecc.

Ora immagino che il resto del modello di dominio non dovrebbe riguardare gli Utenti. Ho una persona di classe che viene utilizzata per modellare le persone e i loro dati associati. Come tale, può essere utilizzato per modellare i dati personali degli utenti e dei non utenti. Un oggetto di tipo Azienda lavora con persone, non utenti. E un'attività viene assegnata a una persona, non a un utente.

La domanda, come posso collegare il modello Persona al modello Utente? Non voglio davvero un riferimento reciproco in nessuno dei due modelli. Devo creare un modello di relazione chiamato PersonUser e creare un servizio aggiuntivo che recuperi l'oggetto persona per l'utente attualmente autenticato?

È stato utile?

Soluzione

A giudicare da ciò che hai presentato, hai un paio di fatti noti:

  1. Ogni utente è una persona
  2. Non ogni persona è un utente

Stando così le cose, estenderei il modello persona per includere un campo UserId nullable in modo da poter mettere in relazione l'utente con la persona per quelle persone che sono anche utenti.

Ora suppongo anche che tu abbia diversi " Fetch " metodi nel modello persona .. per recuperare una persona per ID, nome, dipartimento, ecc ...

Vorrei sovraccaricare (o creare un altro) metodo di recupero per recuperare anche l'oggetto persona da un utente (questo può essere un id o l'oggetto utente foll).

public IPerson Fetch(IUser user) {}

Naturalmente, dato che hai il fatto noto che ogni utente è anche una persona, personalmente non vedo alcun danno o fallo nell'espandere l'oggetto utente per includere una proprietà della persona ...

public interface IUser 
{
   ...
   IPerson Person { get; set; }
}

Quindi, puoi restituire l'oggetto utente come sempre .. e forse eseguire un caricamento pigro funky del campo persona nell'utente ... o popolare entrambi quando recuperi l'oggetto utente.

Non sono sicuro se si sta creando un " mapping " tabella dell'utente < - > La persona ti raccoglierà molto di più di quello che ho descritto sopra (anche se otterrai dei kudo dai DBA hardcore per denormalizzare i tuoi dati) .. per me è solo un tavolo extra a cui unirti per ottenere lo stesso effetto.

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