Pergunta

Eu estou tentando fazer as coisas da maneira DDD (design orientado domínio). E o menino que eu lutar. Em todos os livros que li, A autenticação é de nenhum interesse e não mencionou!

Eu escrevi meu próprio Authentication and Service Membership, que são responsáveis ??por registrar e registro em usuários, criando senhas salgados etc. Não uso provedor de associação do .NET mas dependem de autenticação de formulários.

Eu tenho implementado um modelo User que contém o nome de usuário, E-Mail, PasswordHash, ApprovalStatus etc.

Agora, eu acho que o resto do modelo de domínio não deve preocupar-se com os usuários. Eu tenho uma pessoa de classe que é usado para Pessoas modelo e seus dados associados. Como tal, pode ser usado para modelar os dados pessoais dos usuários e dos não-usuários. Um objeto do tipo Empresa trabalha com pessoas, e não os usuários. E uma atividade é atribuída a uma pessoa, não um usuário.

A pergunta, como faço para relacionar o modelo Pessoa com o modelo do usuário? Eu realmente não quero uma referência a outro em qualquer um dos dois modelos. Devo criar algum modelo de relação chamado PersonUser e criar um serviço adicional que recupera o objeto pessoa para o usuário autenticado no momento?

Foi útil?

Solução

A julgar pelo que você apresentou, você tem um par de fatos conhecidos:

  1. Cada usuário é uma pessoa
  2. Não cada pessoa é um usuário

Sendo esse o caso, eu iria expandir o modelo de pessoa para incluir um campo UserId anulável para que você possa relacionar o usuário à Pessoa para aquelas pessoas que também são usuários.

Agora eu também estou indo supor que você tem vários "Fetch" métodos no modelo de pessoa .. para recuperar uma pessoa por ID, nome, departamento, etc ...

Eu sobrecarregar (ou criar um diferente) método fetch para também recuperar o objeto pessoa de um usuário, bem como (este pode ser um id, ou o objeto de usuário SS).

public IPerson Fetch(IUser user) {}

Claro, desde que você tenha o conhecido fato de que cada usuário também é uma pessoa, eu, pessoalmente, vejo nenhum dano nem falta em expandir o objeto de usuário para incluir uma propriedade pessoa ...

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

Em seguida, você pode retornar o objeto de usuário como sempre .. e talvez fazer alguma carregamento lento funk do campo pessoa do usuário ... ou preencher tanto quando você buscar o objeto de usuário.

Eu não tenho certeza se a criação de uma tabela de "mapeamento" de usuário <-> Pessoa vai reunir-lhe muita coisa além do que eu esbocei acima (embora você terá Kudo do DBA incondicional é para desnormalizar seus dados ) .. para mim é apenas uma tabela extra para se juntar para obter o mesmo efeito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top