public void Start()
        {
            //forçando carregamento do assembly que contém os mappings do nh
            var novoUsuario = new NovoUsuarioCommand(aceitoMkt: true, email: "", nome: "");

            Database.OpenSession();
        }
        public UsuarioRepresentation CriarNovoUsuario(NovoUsuarioCommand usuario)
        {
            //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 = new UsuarioDadosMinimos(usuario.Nome, usuario.Email, usuario.AceitoMkt);
            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 void Deve_Criar_Usuario_Basico()
        {
            var novoUsuario = new NovoUsuarioCommand(aceitoMkt:true, email:"*****@*****.**",nome:"developer" );

            //excluindo usuário pré existente
            Database.Session.Delete(@"from Usuario u where u.Email = '*****@*****.**'");
            Database.Session.Flush();

            //somente nos testes unitários é necessário gerenciar a transação,
            //já que os controllers básicos utilizam o action filter *UseTransactionsByDefaultAttribute
            using (var tx = Database.Session.BeginTransaction()) {

                var novo = new UsuarioService().CriarNovoUsuario(novoUsuario);
                tx.Commit();
                Assert.IsTrue(novo.Id > 0);
            }

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

            UsuarioRepresentation usuarioCriado = null;

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