Projeto – AngularJs + WebAPI com Bearer Authentication + DDD pattern + Ninject + EF Code First com UnitOfWork

By | 13 de abril de 2015

Neste post venho compartilhar com vocês um pequeno projeto de exemplo que fiz utilizando várias tecnologias que estão em alta no mercado.

Estou aberto a sugestões e críticas quanto ao projeto, e espero que possa ser útil como referência a quem tem interesse nestas tecnologias.

O Projeto

  • É um sistema simples, onde você pode se cadastrar e fazer login no sistema.
  • Ao logar, você tem acesso a contatos telefônicos e às categorias dos mesmos.
  • Neste exemplo os registros são comuns entre os usuários.
  • O acesso a dados é feito utilizando EF Code First, e Migrations.
  • O back-end é uma WebApi do .Net, utilizando Bearer Authentication para a segurança.
  • A WebApi utiliza Ninject para injeção de dependências e Owin self-host.
  • A WebApi é configurada para ignorar referência circular ao retornar entidades por JSON, um problema muito comum, e também força o uso de JSON como retorno padrão.
  • Todo o sistema foi feito seguindo o DDD (Domain Driven Design) pattern.
  • O angular utiliza modules que permitem envio da senha criptografado em md5 (neste exemplo, a senha fica em md5 no banco) e conta com um serviço de storage que eu criei para alternar entre localstorage e sessionstorage (com auxílio de um módulo de terceiro).

Download

Você pode baixar a solução completa zipada clicando aqui ou acessar pelo GitHub.

Bibliografia

  • Front-End em AngularJS (Em inglês)

http://bitoftech.net/2014/06/09/angularjs-token-authentication-using-asp-net-web-api-2-owin-asp-net-identity/

  • DDD Pattern, EF Code First e Ninject

  • WebApi com Bearer Authentication

 

Qualquer dúvida, sugestão ou crítica, cite nos comentários.

 

15 thoughts on “Projeto – AngularJs + WebAPI com Bearer Authentication + DDD pattern + Ninject + EF Code First com UnitOfWork

  1. sergio

    Augusto, baixei o teu projeto pra estudar ( estou aprendendo MVC ) e não localizei a pasta App_Data com o banco de dados, como o projeto esta dando erro, acho que seria isso, estou certo?

    Reply
    1. augustoclaro Post author

      Olá,

      o banco de dados é gerado através do Migrations do EF.

      Para gerar o banco, confira sua string de conexão no arquivo de configuração do Startup Project e, no console do NuGet, aponte para o projeto Data e execute:

      Update-Database -Verbose

      Assim, o Migrations usará a string de conexão para criar um banco de dados na instância do SQL especificada da forma especificada no context.

      Espero ter ajudado!

      Reply
  2. Igor

    Primeiramente quero agradecer por disponibilizar este projeto! Augusto, estou tendo um problema para executar a aplicação, estou recebendo um HTTP Error 403.14 – Forbidden. O que poderia ser?

    Reply
    1. augustoclaro Post author

      Olá, Igor!
      Este projeto depende de um banco Sql Server que deve ser gerado configurando a string de conexão no web.config e rodando o comando UPDATE-DATABASE -VERBOSE no console do Nuger.
      Espero ter ajudado!
      Augusto Claro

      Reply
  3. Cheique

    Parabens pelo artigo! Nesse exemplo o front end foi feito em angular. eu vou fazer em MVC DDD terei que utilizar o automapper ?

    grato pelo ajuda.

    Reply
    1. augustoclaro Post author

      Olá, obrigado pelo comentário!

      É sempre interessante utilizar o AutoMapper para facilitar a transferência de dados entre o back e o front sem comprometer dados sensíveis utilizando classes DTO (data transfer object) para decidir as informações que saem e entram na sua api.

      Espero ter sido claro!

      Att,
      Augusto Claro

      Reply
  4. Cheique

    Augusto, obrigado pela prontidão em responder as perguntas. surgiu mais uma duvida e pra que eu não divulgue seu tutorial de forma errada, me ajude nessa questao: estou criando um novo metodo que tem regras de negócio de controle de erros de senha etc. esse metodo com as regras deve estar na camada services ou na application ?

    abs:

    Reply
    1. augustoclaro Post author

      Olá, como vai?

      Para este tipo de validação, e outros tipos, eu recomendo utilizar Specification Pattern. É muito interessante e facilita muito as coisas.

      Um link sobre o assunto: http://enterprisecraftsmanship.com/2016/02/08/specification-pattern-c-implementation/

      Respondendo a sua pergunta, acredito que você tem que pensar no escopo do seu projeto. Se esta é uma validação básica da sua entidade, ou seja, esta validação se aplica independente do ponto em que sua aplicação está, acredito que o correto seria implementar na camada de Services. Caso seja uma validação pontual, em que apenas naquele momento se aplica, implemente na camada de Applications.

      Isso é o que eu faria, pode não ser a forma mais correta.

      Espero ter ajudado!

      Att,
      Augusto Claro

      Reply
  5. Cheique

    Augusto Boa tarde, Usando seu projeto como exemplo, Se na camada ContatoAppService eu precisar consumir algum metodo do repositorio de Usuarios, na ContatoAppService eu chamo a UsuarioService ou tenho que usar a UsuarioAppService ? Pergunto isso porque no meu projeto tenho uma camada de Aplicação que faz varias consultas em banco de dados e as vezes preciso utilizar por exemplo um metodo pra ler o conteudo de uma tabela(entidada) que no foi Tipada( AppServiceBase) na camada de aplicação . abs…

    Reply
    1. augustoclaro Post author

      Este projeto é uma versão antiga que fiz aprendendo, e tem muito a ser melhorado. Normalmente você utilizaria repositórios individuais para cada entidade e, no ContatoAppService por ex, vc referenciaria o UsuarioRepository.

      Reply
  6. Pedro Pizzatto

    Ótima explicação e projeto !!
    Principalmente exemplificando conceitos de maneiras bem simples para o uso no dia a dia.
    Aprendi mto com o projeto ! E com ctz vou acompanhar as novas postagens!

    Obrigado !

    Reply

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *