public UsuarioRepresentation CriarNovoUsuarioComplexo(NovoUsuarioCompletoCommand cmd)
        {
            //primeiro garantimos as regras de negócio ao instanciar novo usuário.
            //qualquer erro de negócio será informado para as camadas superiores como uma BusinessException
            var novoUsuario = EntitiesFactories.UsuarioCompletoFactory.Create(cmd);

            UsuarioRepresentation usuarioCriado = null;
            try
            {
                //  durante a gravação deixamos as constraints do DB agirem.
                novoUsuario.Id = (int)Database.Session.Save(novoUsuario);

                //as camadas superiores (WEB/API) devem sempre receber uma representação web, jamais os objetos de domínio
                usuarioCriado = Database.Session.Get<UsuarioRepresentation>(novoUsuario.Id);
            }

            //Erro de negócio tem duas origens:
            //1. invariants (regras de negócio) da própria Entidade de negócio
            //2. db constraint: veja como ela é gerada em Ticket.API.Shared.NH.SQL*ExceptionConverter
            catch (BusinessException e)
            {
                _log.Debug(e);
                throw;
            }
            catch (Exception e)
            {
                _log.Error(e);
                BusinessExceptionCreator.ThrowBusinessExceptionWithResourcesMessage("ErroInesperadoInsert");
            }

            return usuarioCriado;
        }
        public IHttpActionResult Novo(NovoUsuarioCompletoCommand novoUsuario)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            UsuarioRepresentation usuarioCriado = null;

            try
            {
                usuarioCriado = _usuarioService.CriarNovoUsuarioComplexo(novoUsuario);
            }
            catch (BusinessException be)
            {
                ExceptionConversor.ComplementModelStateErrors(ModelState, be);
                return BadRequest(ModelState);
            }
            return GerarResponse(usuarioCriado);
        }