Desacoplando o ASP.NET Identity do MVC e Domínio

O ASP.NET Identity é uma ótima solução para a gestão dos usuários em sua aplicação, porém seu design é diretamente acoplado ao ASP.NET MVC e também devemos evitar de utilizar suas referências no domínio da aplicação.

Desacoplando o ASP.NET Identity. Finalmente após muitos pedidos eu consegui colocar a mão na massa e desenvolver um projeto modelo para ser usado como referência.

Desacoplando o ASP.NET Identity do MVC e Domínio

Como sabemos o ASP.NET Identity depende diretamente do EF (ou outros), Owin e System.Web, logo todas as implementações do ASP.NET Identity ficam de alguma forma acopladas em nossa camada de apresentação. Quando possuímos uma aplicação onde o usuário é uma peça importante no negócio existe a necessidade de representá-lo na camada de domínio, porém é altamente recomendado que a camada de domínio não conheça tecnologias terceiras (Identity, EF, outros).

Como resolver esse problema?

Foi após alguns estudos que cheguei no modelo que considero ser a “melhor abstração possível”, pois para o ASP.NET Identity funcionar na camada de apresentação é obrigatório levar algumas dependências, porém desde que esteja isolado em outra camada já conseguiremos ótimas boas vantagens.

Aviso: Caso você não conheça o ASP.NET Identity, DDD e Injeção de dependência sugiro que comece pelos tutoriais:

Neste tutorial você encontrará as seguintes tecnologias utilizadas

  • ASP.NET MVC 5
  • ASP.NET Identity 2
  • Entity Framework 6
  • Fluent API
  • Injeção de Dependência com Simple Injector
  • Owin
  • RestSharp para implementação do Twilio API (SMS)

Existem dois grandes objetivos nesta proposta, o primeiro objetivo é a reutilização, pois com um uma única solução (camada) de gestão de usuários é possível atender N aplicações, facilitando o gerenciamento e manutenção.

O segundo objetivo é permitir que a camada de domínio represente o usuário de forma abstraída, logo não existe referência direta do IdentityUser no domínio, porém é possível consultar os dados de usuário e incluir / modificar as informações salvas.

O primeiro passo é abstrair tudo, mover as dependências do Identity para uma camada isolada, depois injetar no MVC os objetos necessários, para essa implementação eu utilizei o Simple Injector, que como o próprio nome diz, é bem simples, rápido e atendeu bem a necessidade.

Com o Identity isolado e injetado devidamente na camada de apresentação (MVC) basta criar uma camada de acesso a dados que irá fornecer meios do domínio consumir dados do usuário de forma abstraída. A grande sacada está no uso correto do Fluent API e claro muita injeção de dependência.

A solução desde modelo não visa atender completamente a filosofia do DDD, pois procurei simplificar o bastante para deixar simples de modificar, por exemplo adicionando uma camada de Application. Portanto quem utilizar esta arquitetura deve estar ciente que algumas coisas a mais ainda precisam ser feitas.

Gostaria de ressaltar também que o template de projeto ASP.NET MVC que o Visual Studio fornece possui vários problemas de design de código. As controllers de Account e Manage do usuário precisaram ser parcialmente re-escritas para atender a injeção do Identity, problemas como mais de um construtor público e utilização do pattern (ou anti pattern?) Service Locator foram encontrados e retirados.

Para quem quiser acompanhar em detalhes técnicos toda a implementação dessa solução eu preparei o vídeo a seguir.

* Assine meu canal no Youtube 🙂

O código fonte desta solução está disponível no GitHub, caso queira propor alguma melhoria faça um Pull Request, será muito bem recebido.


Se você estiver interessado em conhecer mais e aprender como desenvolver aplicações Web com arquitetura baseada em DDD, aplicando os princípios SOLID, diversos Design Patterns e escrevendo testes de unidade inscreva-se em meu curso:

Vamos continuar a troca de experiências, deixe seu comentário abaixo, se gostou e concorda com o artigo compartilhe com seus colegas para transmitirmos o conhecimento para o máximo de pessoas possíveis. ;)

Feliz dia do Programador

O dia do programador é celebrado no 256º dia do ano (13 de setembro ou 12 de setembro nos anos bissextos). O número 256 foi escolhido para esta data porque 256 é o número de valores distintos que podem ser representados com um byte de oito bits. Além disso, 256 em hexadecimal é 100 (0x100), e é a maior potência de 2 abaixo de 365 (o número de dias em um ano).

Feliz dia do Programador! Sim nós temos um dia oficial e não podemos deixar passar sem comemorar e cumprimentar os colegas de profissão.

Feliz dia do Programador

Ser programador é possuir a capacidade de mudar o mundo. Não preciso ir muito longe para completar esse raciocínio, basta lembrarmos de programadores como (Gates, Zuckerberg, Torvalds) entre tantos outros que através de suas paixões realizaram seus sonhos e mudaram a forma de como o mundo funciona.

Ser programador é trabalhar movido pela paixão em usar todo nosso potencial intelectual e criatividade para solucionar problemas existentes e criar novas soluções que facilitam a vida das pessoas.

Ser programador é viver a vida comprometido em estudar para sempre e estar constantemente atualizado. Trocar o dia pela noite, não dormir enquanto não encontrar a solução de um problema (ou simplesmente descobrir a solução enquanto dorme e levantar novamente para implementar e ver se funciona).

Eu não acredito que alguém nasce com dons para programação, a arte de programar é desenvolvida com muito estudo, foco e determinação, muitos exercícios para fortalecer a lógica. Certamente quem tem uma mente mais direcionada ao raciocínio lógico terá mais facilidade para aprender, porém programar é antes de tudo o resultado de muito estudo.

Atualmente tudo com o que nos relacionamos no dia-a-dia envolveu o trabalho de um programador. Sites, redes sociais, sistemas operacionais, aplicativos para computador e celular, dispositivos eletrônicos, transportes e até mesmo nossos eletrodomésticos! Tudo tem em sua base o trabalho de um programador.

É uma das profissões mais prósperas do mundo, inclusive o mundo precisa de muito mais programadores do que existem hoje, com o rápido crescimento e avanço das tecnologias os programadores são peças  cada vez mais fundamentais para o funcionamento deste ecossistema.

Existem muitas piadas relacionadas aos programadores, sobre não ter vida social, ganhar pouco dinheiro, trabalhar demais. Eu vejo isso como simples piadas, ser programador não é mais uma atividade para nerds e seres excluídos socialmente como retratam muitas vezes. É possível ser programador e ter uma ótima qualidade de vida, tempo disponível e claro um excelente salário, tudo depende de estudo, foco e determinação (e obviamente de boas escolhas).

Ser programador é poder trabalhar quando quer, a hora que quiser, em qual país quiser. É poder trabalhar em grandes empresas ou simplesmente ser o seu próprio chefe. Programadores são universais, podemos trabalhar em um país e morar em outro, podemos planejar nossa vida com uma liberdade que não existe em muitas profissões e atividades.

Então sinta-se uma pessoa de sorte, pois você é um programador!

Em alguns anos o número de vagas de trabalho abertas para programadores será o dobro do número de programadores existentes. Se você conhece alguém que se interesse por esta área o incentive a entrar! Se você já um programador não deixe nunca de estudar, sua carreira e meta de vida só dependem dos seus esforços!

Gostaria de oferecer uma ajuda na sua educação, estou dando 20% de desconto em todos os meus cursos até dia 20/09/19. Aproveite 🙂

Um abraço a todos programadores e estudantes. Juntos desenvolveremos um mundo melhor 🙂