Pergunta

Suponha que eu tenha um sistema complexo, onde há árvores grandes de pessoas.Simples pensamentos são empregados / gerente de relacionamento, muitos funcionários de relatório para um gestor.Agora, além de gerenciador há pessoal de suporte, que são capazes de agir sobre o nome do gestor pode manipular os gerentes, funcionários.

Em um sistema de CQRS como você se modelo de uma mensagem para uma hipotética ação de "editar empregado" onde o chamador da ação é um pessoal de suporte.A ação só pode ter êxito se o membro do pessoal segundo o gerente de segurança de relacionamento está atuando sobre um funcionário em seu reino.

Verificar a segurança de que isto seria envolvem a consultar o banco de dados para validar que a pessoa a ser modificado é, de fato, dentro do empregado cadeia do gestor.

Onde estaria essa consulta ocorrer?Antes de originando a "editar empregado" mensagem?

Se os dados iniciais validado antes de a mensagem de origem, na, eventualmente, um sistema coerente supor que, antes de editar "empregado" mensagem tenha sido processada, uma acção separada ocorreu que teria removido a autoridade do usuário para concluir a "editar empregado" de ação.Se o manipulador de comando não validar as preocupações com a segurança de que a mensagem, a mensagem seria ainda ter êxito, mesmo que o usuário não é mais a autoridade para executá-lo.

Isto parece implicar que a dupla de validação, semelhante a INTERFACE do usuário validação e a validação do lado do servidor seria o melhor curso de ação.No entanto, o método de completar a validação de que parece que seria violar princípios essenciais para CQRS.

Qual a abordagem(es) são melhores quando tem que lidar com estas e outras semelhantes transversal preocupações quando usando CQRS?

Foi útil?

Solução

Eu provavelmente iria pular inteiramente CQRS para este domínio e ter a tela da Web conversando diretamente ao nível DB (sem mensagens).Simples simpática concorrência deve lidar com os poucos conflitos que aconteceriam.

Outras dicas

Primeiro, concordo com o @Yahia o comentário de que não há um geral de resposta.Com isso dito, aqui está como eu gostaria de abordá-lo.

Para começar, eu provavelmente vá com a dupla validação -- uma vez no meu controlador quando o pedido foi recebido pela primeira vez e, em seguida, mais tarde, em meu domínio, como é o processamento do comando.Alguns podem não concordar com isso, mas eu prefiro evitar um comando que está sendo emitido e permitir que o usuário sabe imediatamente que não estavam autorizados a executar alguma ação em vez de ter o comando de passar e dependem de consistência eventual por algum erro de aviso para alertar o usuário, após o fato de que eles não podem executar a ação.

Assim, em termos de pseudo-código, aqui está a minha abordagem para Editar Empregado:

Controlador de

[HttpPost]
ActionResult Edit(Employee emp){

  //get employee org information from _employeeRepository
  //validate if _loggedInUserID is able to edit emp.ID

  if(isValid) {
    //construct command
    _commandService.EnqueueCommand(new EditEmployee(emp.ID, emp.Name, emp.Salary));
  } else {
    return View("PermissionError");
  }

  return Redirect("EmployeeProperties");
}

Então aqui o meu serviço de comando pega o comando e rotas-o AR em meu domínio, o que seria Empregado.

Empregado De Domínio

protected void EditEmployee(userID, employeeID, employeeName, salary){
  //get employee org information from _employeeRepository
  //validate if userID is able to edit employeeID

  if(isValid) {
    //apply event
    ApplyEvent(new EmployeeEdited(userID, employeeID, employeeName, salary));
  }
}

Então, eu gostaria de aplicar o mesmo de verificação de segurança, tanto o meu controlador e no meu domínio.Eu teria, provavelmente, como um método encapsulado (bem, provavelmente encapsulated critérios de classe que eu iria passar para o repositório).

Então, eu espero que isto ajude como eu iria abordar este cenário.Deixe-me saber se há perguntas, e eu vou elaborar em minha resposta.

Espero que isso ajude.Boa sorte!

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