2

J'essaie de faire les choses de la manière DDD (Domain Driven Design). Et le garçon je me bats. Dans tous les livres que j'ai lus, l'authentification n'est pas une préoccupation et n'est pas mentionnée! J'ai écrit mon propre service d'authentification et d'adhésion qui est responsable de l'inscription et de la connexion des utilisateurs, de la création de mots de passe salés, etc. Je n'utilise pas le fournisseur d'abonnement .NET mais je compte sur l'authentification par formulaire.Où puis-je trouver des informations sur l'authentification et l'autorisation dans le contexte de la conception guidée par domaine?

J'ai mis en place un modèle de l'utilisateur qui détient le nom d'utilisateur, E-Mail, PasswordHash, ApprovalStatus etc.

Maintenant, je pense que le reste du modèle de domaine ne devrait pas se préoccuper des utilisateurs. J'ai une personne de classe qui est utilisée pour modéliser les personnes et leurs données associées. En tant que tel, il peut être utilisé pour modéliser les données personnelles des utilisateurs et des non-utilisateurs. Un objet de type Company travaille avec des personnes, pas des utilisateurs. Et une activité est assignée à une personne, pas à un utilisateur.

La question, comment associer le modèle Person au modèle User? Je ne veux pas vraiment une référence les uns aux autres dans l'un ou l'autre des deux modèles. Dois-je créer un modèle de relation appelé PersonUser et créer un service supplémentaire qui récupère l'objet de personne pour l'utilisateur actuellement authentifié?

Répondre

2

A en juger par ce que vous avez présenté, vous avez quelques faits connus:

  1. Chaque utilisateur est une personne
  2. Non chaque personne est un utilisateur

Cela étant Dans le cas, j'élargirais le modèle de personne pour inclure un champ UserId nullable afin que vous puissiez lier l'utilisateur à la personne pour les personnes qui sont également des utilisateurs.

Maintenant, je vais aussi supposer que vous avez plusieurs méthodes « Fetch » dans le modèle de personne .. pour récupérer une personne par ID, nom, département, etc ...

Je surcharge (ou créer une méthode fetch différente) pour récupérer également l'objet person d'un utilisateur (ceci peut être soit un identifiant, soit l'objet utilisateur foll).

public IPerson Fetch(IUser user) {} 

Bien sûr, puisque vous avez le fait connu que chaque utilisateur est une personne, je ne vois personnellement pas de mal, ni faute dans l'expansion de l'objet utilisateur d'inclure une propriété de personne ...

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

Ensuite, vous pouvez retourner l'objet utilisateur comme toujours .. et peut-être faire un chargement paresseux funky du champ de la personne dans l'utilisateur ... ou remplir les deux lorsque vous récupérez l'objet utilisateur. Je ne suis pas sûr si créer une table de "mapping" de l'utilisateur < -> Personne va vous recueillir beaucoup de quoi que ce soit au-delà de ce que j'ai décrit ci-dessus (bien que vous obtiendrez kudo des DBA hardcore pour dénormaliser votre données) .. pour moi, c'est juste une table supplémentaire à joindre pour obtenir le même effet.

+0

Je ne vais pas le faire de cette façon, mais merci pour votre contribution. J'ai découplé mon utilisateur de mon modèle Person, à la fois dans le modèle de domaine et dans ma base de données. Question acceptée depuis que vous m'avez aidé à éclaircir les choses. – kitsune

+1

Merci pour l'acceptation .. Je serais vraiment intéressé à entendre comment vous avez abordé cette question et quelle était votre solution finale.Je suis un fervent partisan de garder un esprit ouvert et d'apprendre que de nombreuses approches différentes du même problème aident tout le monde à devenir un meilleur ingénieur/architecte. – datacop

Questions connexes