Compilado sobre Domain Driven Design

Fala pessoal, tudo em ordem? Esta semana tivemos mais um aspnet{cast} e apresentamos a quinta parte do tema Domain Driven Design.

O DDD é um assunto muito polêmico, sempre dá margem para muita discussão, várias interpretações e afins, mas tentamos sempre de uma forma descontraída, abordar este assunto, que é de extrema importância quando falamos de softwares em larga escala.

Sendo assim, estou separando aqui os vídeos que fizemos no aspnet{cast} sobre DDD, para facilitar a vida de você que está trilhando este caminho.

Só os vídeos bastam?

Claro! Que não… Se você quer se aprofundar mais neste assunto, existem alguns livros “obrigatórios” para leitura.

Existe algum exemplo completo?

Não! E dificilmente você irá encontrar um exemplo completo de DDD. O DDD é um conceito, que várias pessoas podem interpretar de formas diferentes.

Além disso, ele é algo muito abrangente, não tem como criar um exemplo e abordar tudo de DDD nele, seria como tornar algum projeto grande público.

Um exemplo que construí com Yan Justino e que abordam conceitos como Domain Notification, Domain Events, Shared Kernel, Bounded Contexts entre outros é o Room Booking, mas mesmo assim, ele está longe de ser completo.

Em resumo…

Assista os vídeos, leia os livros, implemente os conceitos pedaço a pedaço. Juntar tudo é um desafio, então escolha projetos não críticos para seu uso!

Treinamentos

** Você pode realizar uma assinatura do site e ter acesso a estes e outros treinamentos.

Bons estudos!

Roadmap do ASP.NET 5

Fala pessoal, como estão? A pergunta que tenho ouvido com mais frequência ultimamente é “Quando sai o novo ASP.NET?”, e finalmente temos um roadmap final, que claro, é apenas uma estimativa.

Segundo a página do Wiki no GitHub do ASP.NET, as datas são:

Milestone Release Date
Beta6 27 Jul 2015
Beta7 24 Aug 2015
Beta8 21 Sep 2015
RC1 Nov 2015
1.0.0 Q1* 2016

Porém, ontem houveram problemas com a Beta 6, que foi adiada para hoje (28/07).

20150728

Então posso colocar meu projeto vNext em produção?

Beta significa que ainda não está pronto, então utilize por sua conta e risco. Trabalhar nas versões Beta nunca é tranquilo. Teve várias vezes que um Beta quebrou outro, e como isto é feito no Azure? Como ele recebe as atualizações? É algo no servidor, que nem sempre temos controle. Então muita calma nesta hora!

 

Abraços!

Minhas palestras no TDC SP 2015

Boas pessoal, como estão?
Nos dias 24 e 25 de Julho palestrei no TDC SP (The Developers Conference), um dos maiores eventos de desenvolvimento do Brasil.

Mais uma vez o evento foi sensacional, muito conteúdo técnico e o pessoal bem empolgado.

Este ano foi diferente para mim, pois tive oportunidade de palestrar em uma trilha onde não mostrei NADA do que estou acostumado a mostrar, ou seja, .NET. Então, que esta seja a primeira de muitas palestras sobre Web e tecnologias adjacentes a ela.

Na minha primeira palestra, mostrei a construção de um Instagram, criado com Firebase e AngularJs

Criando Real-Time Web Apps com Firebase e AngularJs

Apresentação:
http://www.slideshare.net/andrebaltieri/tdc-sp-2015-criando-web-apps-real-time-com-angularjs-e-firebase

Demos:
https://github.com/andrebaltieri/instagram-firebase-web

Na segunda palestra, falei sobre as novidades e criação de aplicações ASP.NET MVC no Mac.

Criando Aplicações ASP.NET MVC no Mac 

Apresentação:
http://www.slideshare.net/andrebaltieri/tdc-sp-2015-criando-aplicaes-aspnet-no-mac

Demos:
https://github.com/andrebaltieri/tdc-sp-2015-demos

Espero que tenham gostado. As palestras foram gravadas e assim que estiverem disponíveis compartilho com vocês!

Abraços,

Criando um Instagram com NodeJs, Socket.io e AngularJs – Parte 1

Nos posts anteriores vimos um pouco sobre aplicações Web conectadas (Real-time) com algumas tecnologias, como NodeJs/Socket.io, ASP.NET/SignalR e Firebase. Vamos agora nos aprofundar um pouco mais e criar alguns exemplos mais reais com estas plataformas.

A ideia aqui é simples, construir um Instagram (Aquele que você posta suas fotos com uns efeitos maneiros) utilizando as tecnologias mencionadas no título do post.

Para isto, você precisará do seguinte:

  • NodeJs
  • Bower, Grunt, Ionic (Instalados via NPM)
  • MongoDB (Local ou via MongoLab)
  • Um editor de código que você goste

Post anterior para referência

Criando um chat com NodeJs e Socket.io
https://andrebaltieri.wordpress.com/2015/07/09/criando-um-chat-com-nodejs-e-socket-io/

Construindo o Backend

Antes de tudo, crie uma pasta para sua aplicação e execute os comandos abaixo

npm init
npm install socket.io --save

Isto vai fazer com que os módulos do Socket.io, sejam baixados para pasta node_modules da aplicação.

Para este exemplo, não vamos utilizar o Express. Na verdade não precisamos dele, pois vamos ter o servidor Socket separado do servidor da aplicação. Como o Angular já tem seu esquema de rotas e tudo mais, só precisamos do Socket.io rodando no server mesmo.

Sendo assim, vamos criar um arquivo chamado “app.js” na raiz da aplicação com o seguinte conteúdo.

20150712_001

Na instância do Socket, já informamos a porta que a aplicação vai rodar, no caso a 5430. Fora isso, nada de novo por aqui (Se você acompanhou os posts anteriores…).

Execute o comando abaixo na raiz da aplicação, e já podemos acessar o “js” gerado pelo Socket.io no browser.

node app.js

Então, no browser navegue para http://localhost:5430/socket.io/socket.io.js. Nosso arquivo a ser consumido pelo cliente (AngularJs está aí).

Por hora, nosso backend está pronto 🙂

Frontend

Para iniciar o frontend, na raiz da aplicação vamos executar os seguintes comandos.

bower init
bower install angular angular-route ng-socket-io ngImgCrop --save

Estes são os pacotes que vamos precisar para trabalhar com AngularJs e Socket.io.

O pacote “ng-socket-io” tem um detalhe, ele não suporta a especificação da URL que vamos utilizar na conexão do Socket, que neste caso é diferente da URL da aplicação.

Eu fiz um ajuste no meu fork deste repositório e submeti um request para eles, mas até a escrita deste post ele não havia sido aceito. Então, substitua o arquivo “ng-socket-io.js” da pasta “bower_component/ng-socket-io” por este abaixo:

https://github.com/andrebaltieri/ngSocketIO/blob/master/src/ng-socket-io.js

Para melhor organização, criei uma pasta chamada “app” na raiz, e vamos manter o frontend todo aí dentro. Por hora, crie uma página chamada “index.html” na raíz desta pasta, apenas com o esqueleto padrão (HTML, HEAD, TITLE, BODY).

Criando os efeitos

O charme do Instagram são os efeitos que ele adiciona as fotos, e isto conseguimos reproduzir facilmente via CSS. Separei um arquivo com alguns efeitos como escala de cinza, brilho extra, sépia e afins. Você pode encontrá-lo aqui:

https://github.com/andrebaltieri/insta-sockeio/blob/master/app/content/filters.css

Este arquivo deve ficar na pasta “app/content/filters.css”.

Adicionando os estilos

Para uma melhor estética da aplicação, vamos utilizar um tema do Bootswatchm que se baseia no Bootstrap, os estilos do ngImageCrop e também os filtros que criamos em nosso CSS.

Então, no arquivo “Index.html”, abaixo da tag TITLE, vamos adicionar os scripts necessários para aplicação funcionar.

<link rel="stylesheet" href="https://bootswatch.com/paper/bootstrap.min.css"/>
<link rel="stylesheet" href="../bower_components/ngImgCrop/compile/minified/ng-img-crop.css"/>
<link rel="stylesheet" href="content/filters.css"/>

Criando o cabeçalho

Nossa aplicação vai ter apenas duas páginas, sendo elas “Home”, onde serão listadas as imagens e “Postar” onde vamos poder publicar novas imagens. Deste modo, criei um “navbar”, logo após a tag “body” que ficará no topo da página, e serve como menu principal para o usuário.

20150712_002

 

Um dos requisitos para as rotas no AngularJs é o “#” antes da mesma, então nas linhas vinte e cinco e vinte e seis, temos os links apontados para “#/” e “#/post”. Veremos isto com mais detalhes posteriormente.

Adicionando os scripts

Outro requisito são os scripts, do Angular, rotas, image crop e do Socket. Então vamos adicioná-los ao final da página, antes da tag “</body>”.

<script src="http://localhost:5430/socket.io/socket.io.js"></script>
<script src="../bower_components/angular/angular.min.js"></script>
<script src="../bower_components/angular-route/angular-route.min.js"></script>
<script src="../bower_components/ngImgCrop/compile/minified/ng-img-crop.js"></script>
<script src="../bower_components/ng-socket-io/ng-socket-io.js"></script>

E pronto! Isto é tudo que precisamos para iniciar nossa aplicação.

No próximo post vamos ver como trabalhar com AngularJs e Socket.io e finalizar a postagem e leitura de imagens!

Este exemplo completo e funcionando você encontra no meu GitHub:
https://github.com/andrebaltieri/insta-sockeio

 

Abraços,

 

Criando um chat com Firebase

Nos posts anteriores comentei sobre Node com Socket.io e ASP.NET com SignalR, ambos muito simples e fáceis de utilizar. Se você ainda não viu, confira nos links abaixo:

Pois bem, hoje é dia de falar de um modelo conectado que abstrai seu backend por completo.

Abstração do Back-WHAT???

Soa um tanto quanto estranho, eu sei, mas calma! Durante esta chuva de novas tecnologias e conceitos que a Web nos trás, tivemos a chegada dos famosos NoSQL, banco de dados não relacionais, que armazenam os dados no formato JSON, que é justamente o que o seu frontend (Os moderno pelo menos) precisa de informações.

Trafega JSON pra cá, recebe JSON de lá, por que não expor meu banco de dados como uma API? Parece uma ótima ideia, já que os dados estão armazenados no formato JSON, criam-se simplesmente endpoints de acessos aos mesmos…. Ohhhhh :O

Existem várias plataformas e ferramentas que já oferecem este serviço por aí, então por que escolhi o Firebase para este exemplo?

Firebase

O Firebase faz tudo isso que eu disse acima. Você se cadastra no site, cria sua aplicação lá, salva os dados como JSON e pronto, já tem uma URL expondo suas informações na internet sendo controlada por um token de acesso você cria.

Porém o Firebase foi além neste conceito, e criou um esquema onde você fica conectado sempre ao banco, e melhor, você recebe notificações do banco! Igual no CouchDB. Então estou te dizendo, que quando um novo usuário se cadastrar em seu site por exemplo, todos os usuários online podem automaticamente receber uma notificação…

Isso ocorre por que o Firebase tem a capacidade de disparar uma trigger, chamando uma função JavaScript que está no seu frontend sempre que um registro entrar ou for alterado na base.

A propósito, vou fazer um Instagram em tempo real com Firebase e AngularJS na minha palestra do TDC SP no dia 24/07
http://www.thedevelopersconference.com.br/

Iniciando

Antes de tudo, você precisa de uma conta no Firebase, gratuita mesmo, então vá até o site e cadastre-se:
https://www.firebase.com/

O Firebase é um recurso PAGO, e você paga pelo tamanho em dados e quantidade de conexões ao simultâneas.

Feito seu cadastro, autentique-se e vá para sua Dashboard, nesta tela preencha as informações App Name e App URL e pronto, temos um endpoint.

20150710-001

Note que ele já nos dá a URL, que é composta pelo “APP URL” e o sufixo “firebaseio.com”.

Se você acessar a URL (No meu caso https://chat-balta-demo.firebaseio.com/) vai cair em uma página para gerenciar os dados, ou você pode fazer POST e GET para este endpoint e já estará tudo funcionando.

Vou realizar um post aqui apenas para demonstrar. Neste exemplo, eu uso o Postman, uma extensão para o Chrome/Firefox.

20150710-002

Note que no final da URL adicionei o sufixo “chat.json”, o que significa que vou criar uma “tabela” para armazenar este post. O próprio Firebase, baseado no JSON enviado já se encarrega desta criação.

Como resultado, na tela de gestão da aplicação, já temos a informação em tempo real sendo exibida.

20150710-003

Para cada item enviado, o Firebase cria um identificador único a ele, como mostrado na imagem acima em amarelo.

Frontend

Não vou repetir o HTML do frontend aqui, podemos utilizar o mesmo dos posts anteriores. Só vamos mudar a parte dos scripts.

20150710-004

 

Primeiramente, precisamos do “firebase.js” que pode ser referenciado utilizando o próprio CDN do Firebase, como mostrado na linha um.

Para trabalhar com o Firebase, precisamos de uma instância do seu repositório, que é realizada utilizando “new Firebase(…”, como mostrado na linha quatro. Note que no final da URL temos um “/chat” (Sem o .JSON), indicando que os dados serão salvos no repositório “chat” que criamos no exemplo do Postman.

Seguimos então com a ação de envio da mensagem, quando o usuário clica no botão “Enviar” (Linha cinco). Neste momento, a única coisa que precisamos fazer é realizar um “push” no no “db”, enviando um JSON como parâmetro. Sendo assim, temos na linha sete a realização do evento de envio de mensagem. Simples assim 🙂

Como comentei, um dos diferenciais do Firebase é que ele permite callbacks do banco para nossa aplicação, então dada determinada ação, o Firebase vai char uma função do nosso JavaScript.

Isto é feito através do “db.on(…” (Linha onze), e no nosso caso, seremos notificados apenas quando um novo objeto for adicionado (Evento “child_added”). Existem outros eventos como quando um objeto é atualizado ou excluído também, mas este que usamos nos atende aqui.

Toda vez que um objeto for adicionado, um snapshot (Uma foto, um espelho, o objeto mesmo) será enviado para esta função no parâmetro “snapshot” (Ainda na linha onze).

Como este objeto é composto de mais coisas do que precisamos, criei uma variável “data” (linha 12) onde recebo apenas a propriedade “val” deste objeto, ou seja, só as suas propriedades.

Feito isto fica simples, basta adicionar o valor “data.message” na lista de mensagens e pronto! Temos um chat com Firebase como nosso backend 🙂

Os fontes deste post você encontra no meu GitHub
https://github.com/andrebaltieri/firebase-chat

O que acharam?

 

Abraços,

Criando um chat com ASP.NET e SignalR

No post passado, mostrei como é a criação de um chat com NodeJs e Socket.io. O chat é um bom e simples exemplo de como trabalhar com Sockets e aplicações Web conectadas.

Não vou revisar os conceitos que já passei no post anterior, então recomendo que leia-o antes.

https://andrebaltieri.wordpress.com/2015/07/09/criando-um-chat-com-nodejs-e-socket-io/

Pacotes necessários

Quem me conhece sabe que não gosto dos templates padrões que o ASP.NET tem, vem muito lixo junto! Então, para este projeto vamos usar um Empty Web Application, e adicionar os seguintes pacotes.

  • Install-Package Microsoft.Owin.Host.SystemWeb
  • Install-Package Microsoft.Owin.Cors
  • Install-Package Microsoft.AspNet.SignalR.SelfHost
  • Install-Package Microsoft.AspNet.SignalR.JS

Sim, vamos utilizar Owin como base, já que seu pipeline é bem mais reduzido e só precisamos do SignalR. O último pacote são os Scripts para front-end. Neste exemplo, deixarei o front/back no mesmo projeto, mas o ideal seria separá-los. Eu mostrarei onde eles se referenciam.

Criando o backend

Com a aplicação criada, crie uma nova classe chamada “Startup.cs” na raíz da aplicação (É o padrão do Owin) com o seguinte conteúdo.

20150709-001

Pronto, tudo que você precisa para o SignalR funcionar é isto! Tão simples quanto o Node/Socket.io.

O SignalR trabalha com um conceito de Hubs ao invés dos convencionais Controllers do MVC/WebAPI. Os Hubs nada mais são do que classes que herdam de uma classe base chamada “Hub”.

Nesta classe você pode criar seus métodos, receber seus parâmetros e enviar as mensagens para grupos ou todos os usuários conectados. Para nosso simples chat, vamos adicionar um Hub como o abaixo, chamado de “ChatHub.cs”. Para organizar melhor, criei uma pasta chamada “Hubs” na raiz da aplicação.

20150709-002

No exemplo acima, na linha cinco temos a herança da classe base que nos permite utilizar a variável “Clients” da linha nove.

Criei um método “Send” que não retorna nada e espera uma mensagem do tipo string como parâmetro. Neste método, utilizo o “Clients.All.addMessage(message)” para enviar esta mensagem para todos os usuários conectados.

Se notarmos, o “All” é um tipo dinâmico, o que significa que podemos colocar qualquer valor depois dele… Este nome “addMessage” será a função JavaScript a ser disparada no cliente. Então, se mudar aqui, tem que mudar lá 🙂

E simples assim nosso backend está pronto!

Frontend

Para trabalhar no frontend, eu criei um arquivo “index.html” na raíz da aplicação e utilizei o mesmo conteúdo do “index.html” do post passado, alterado apenas os Scripts.

Assim que rodamos nossa aplicação SignalR, um endereço fica disponível em nosso Browser, contendo os scripts dos nossos Hubs (http://localhost:PORTA/signalr/hubs). Temos que incluir o jQuery, o jQuery.SignalR e também esta URL que o SignalR nos gera. Caso você esteja hospedando sua aplicação em outro endpoint, você teria que alterar esta URL para apontar para ele.

20150709-003

Como estou rodando o back/front no mesmo caminho, os locais em amarelo se iniciam da raiz. Caso sua aplicação estivesse em outra porta ou outro domínio você precisaria alterar estes pontos.

Assim como o Socket.io, o primeiro passo é se conectar com o servidor, que é feito através do “$.connection.hub.url” na linha seis.

Com a conexão aberta, você precisa da instância do Hub (Linha sete) que você vai utilizar, que no nosso caso é o “ChatHub”. É importante salientar que há uma conversão de nomes aqui. No C# normalmente utilizamos a primeira letra em maiúscula na criação das classes, métodos e propriedades públicas, no JavaScript não. Sendo assim, nosso “ChatHub” se torna “chatHub”.

Lembra do método “addMessage”? Pois é ele está disponível agora no objeto “chat” (Linha nove), e como ele esperava uma mensagem como parâmetro, na criação da sua função declaramos uma variável para representar este valor (… = function(message){…).

Ao adicionada uma mensagem, esta função será chamada e assim temos na linha dez a adição da mensagem na tela.

Para finalizar, ao clicar no botão enviar, temos o “chat.server.send” que representa o método “Send” criado no C# sendo chamado, e enviamos a mensagem para ele, que por sua vez envia a mensagem para todos os clientes conectados.

Simples né 🙂

O código completo deste exemplo você encontra aqui:
https://github.com/andrebaltieri/signalr-chat

 

Abraços,

Criando um chat com NodeJs e Socket.io

Você já perceberam que estamos sendo invadidos por modelos de aplicações web conectadas? Sim, conectadas… O que antes era “heresia” (Sempre que abrir uma conexão, feche-a filho!) agora vem mudando seu rumo.

Componentes como Socket.io e SignalR permitem que sua aplicação fique conectada o tempo todo com seu servidor. O que isso significa? Que podemos ser notificados pelo servidor sobre mudanças, que temos informações em tempo real, que é tudo muito instantâneo.

Antes de começar…

Há um tempo atrás, participei de um projeto que tinha um chat feito com Socket.io e estava sendo hospedado no Microsoft Azure, mais especificamente em um Web App do Microsoft Azure.

O que acontece é que a hospedagem de Web Apps no Azure possui um limite de conexões. Então, antes de hospedar sua aplicação você precisa verificar se o servidor suporta WebSockets e a quantidade de conexões simultâneas.

Para o Microsoft Azure Web Apps, os valores são:

  • Free: (5) concurrent connections per website instance
  • Shared: (35) concurrent connections per website instance
  • Basic: (350) concurrent connections per website instance
  • Standard: no limit

Fonte: https://azure.microsoft.com/blog/2013/11/14/introduction-to-websockets-on-windows-azure-web-sites/

Bom, agora que sabemos um pouco sobre infraestrutura, let’s code!

Iniciando a aplicação

Para este exemplo, vamos baixar todos os pacotes pelo NPM, então para começar, abra um terminal, crie uma pasta chamada “chat” (Eu criei em “c:\dev\chat”), e navegue para esta pasta e execute o comando:

npm install

Pode dar enter para todas as opções, e isto vai gerar um arquivo package.json na raiz da pasta.

Agora é hora de instalar os pacotes necessários, então execute o comando:

npm install angular express@4.10.2 socket.io --save

Note que temos a instalação de vários pacotes, separados por um espaço em branco. Na instalação do “express” temos a versão sendo especificada pelo “@” e no final temos um “–save”, que vai escrever estes pacotes como dependências no nosso “package.json”.

Iniciando o servidor

Para iniciar, precisamos criar um arquivo “index.js” na raiz da pasta, com o seguinte conteúdo:

20150708-001

 

Uma das coisas que mais gosto do Node é a simplicidade com que as coisas podem ser construídas nele. Nas linhas superiores, temos as declarações das variáveis “app” e “http”, já instanciando os módulos deles.

O “app.get” fica ouvindo uma URL e responde a sua chamada, que neste caso é um simples envio de uma tag HTML.

Por fim temos a inicialização do servidor HTTP, ouvindo na porta 5002.

Voltando para o terminal, basta executar o comando abaixo para iniciar a aplicação:

node index.js

Feito isso, abra seu browser e navegue para a URL http://localhost:5002 e aqui está nossa aplicação 🙂

Melhorando nosso código, não seria “inteligente” deixar a o retorno da nossa requisição (res.send…) retornar uma tag, então vamos mudá-lo para retornar um arquivo HTML, assim podemos manipulá-lo sem a necessidade de parar a aplicação.

Para isso, substitua a linha cinco por:

res.sendFile(__dirname + ‘/index.html’);

Feito isso, sempre que navegarmos para a URL padrão (http://localhost:5002/) será servido um arquivo “index.html” que deve estar na raiz da pasta. Vamos então criar este arquivo, conforme o código abaixo.

20150708-003

Adicionando Socket.io

A primeira coisa que precisamos fazer é inicializar uma instância do Socket.io e passar o objeto “http” como parâmetro para ele. Isto pode ser feito adicionando a linha abaixo logo após a instância do objeto HTTP na linha três (var http = require…).

var io = require('socket.io')(http);

Feito isto, já podemos ouvir os eventos do Socket.io, como o “connection”, que é disparado toda vez que um usuário se conecta. Para isto, vamos adicionar o seguinte código ao arquivo “index.js”.

20150708-004

 

Pronto, por hora nosso backend está completo… Agora precisamos escrever o JavaScript do frontend para que nossa página se conecte ao socket que criamos.

Adicione o seguinte trecho de código antes da tag “</body>” do arquivo “index.html”. Note que referenciamos o Socket.io (Versão client) e iniciamos uma variável chamada “socket”.

20150708-005

Feito isto, vamos voltar ao terminal e executar novamente a aplicação (Caso sua aplicação esteja rodando, aperta CTRL+C para parar) executando o comando “node index.js” novamente.

No browser, atualize a página. Agora você verá a seguinte mensagem no terminal.

Um usuário se conectou

Existem vários outros listeners como “disconnect” para disparar um evento quando o usuário se desconectar, mas não vou entrar em detalhes aqui.

Emitindo eventos

A primeira coisa que precisamos fazer para emitir eventos é definir um escopo utilizando “socket.on(‘MEUESCOPO’…”, isto retornará uma função, com a mensagem sendo recebida via parâmetro. Feito isto, podemos utilizar o “io.emit” para enviar a mensagem para todos conectados neste escopo.

20150708-006

Feito isto, basicamente repetimos o mesmo processo no JavaScript do frontend. Ao clicar no botão enviar, vamos realizar um “socket.emit” para o escopo “message” que definimos. Depois vamos criar um listener (socket.on(‘message’…) onde, ao chegar uma nova mensagem, vai adicioná-la a lista de mensagens.

20150708-007

E pronto! Nosso chat está terminado… Abra duas, três, quatro abas no seu navegador e você já pode conversar com suas várias personalidades 🙂

O código completo você encontra aqui: https://github.com/andrebaltieri/node-socket-chat e para rodar o exemplo você precisa executar o comando “npm install” na raiz da pasta.

O que acharam? Simples né!

Fonte: http://socket.io/get-started/chat/

 

Abraços,

Isolando e testando suas queries

Os ORMs invadiram nosso mundo há um tempo e desde então estão se consolidando cada vez mais no mercado.
Apesar de sabermos sobre seus pontos negativos (Principalmente em relação a performance), seu uso traz muita produtividade, e combinado com MicroORMs, muitas vezes é uma ótima solução.

Onde ficam suas queries?

Em vários momentos, durante o desenvolvimento de sistemas, me deparei com uso de queries iguais, ou bem semelhantes, o que me levou a pesquisar mais sobre o assunto.

Eu mantinha minhas queries todas na camada de acesso à dados mesmo. Por exemplo, eu tinha uma query para listar os produtos no meu repositório de produtos, porém eu queria que esta mesma query só me listasse os produtos em estoque. Com esta afirmação, eu acabei de criar uma regra de negócio… “Somente os produtos em estoque devem ser listados”.

Posteriormente, discutindo com o @yanjustino sobre este cenário, e chegamos até uma implementação parecida com esta abaixo, utilizando Specs.
https://github.com/andrebaltieri/room-booking

Trabalhando com Specs

O segundo ponto que discutimos foi, regras de negócio devem ficar no domínio. Sendo assim, vamos mover as nossas queries no formato de especificações para nosso domínio, neste caso para uma pasta chamada Specs.

Em seguida, vamos criar as especificações para obtenção dos produtos em estoque e fora de estoque, como mostrado abaixo:

No exemplo acima temos uma classe estática, contendo duas expressões, uma onde a quantidade em estoque dos produtos é maior que zero e a outra para a quantidade em estoque dos produtos em zero. O ideal é que não haja estoque negativo, e caso queira este controle, poderá implementar uma terceira query, com quantidade menor que zero.

O que ganhamos com isso?

Bom, o primeiro ponto é o reuso, já que podemos aplicar estas queries em vários repositórios, como mostrado no exemplo abaixo.

ProductRepository.cs

Na imagem acima podemos ver o uso das duas Specs criadas na implementação do repositório de produtos.

O segundo ponto, e com certeza o mais importante é a capacidade de testar estas queries isoladamente, como mostrado na imagem abaixo

20150707-003

Com os testes escritos, é só rodar e ver o resultado 🙂

20150707-004

O que isso tudo significa?

Bom, se você utiliza especificações, caso precise mudar sua query, você terá um ponto único de mudança, e isto refletirá em todo seu sistema. Se por exemplo, amanhã ou depois você decidir sempre listar todos os produtos para os clientes, basta modificar o ProductSpec e pronto!

Caso dê algo errado, você terá os testes cobrindo estas regras impostas na leitura de dados!

Em resumo, tratar as queries no formato de specs para mim traz os seguintes benefícios:

  • Mantém as regras de negócio concentradas no domínio
  • Remove as regras de negócio da camada de acesso a dados
  • Permite o reuso das queries
  • Permite execução de testes sobre as queries

E aí, o que acharam?

Lembrando que este e outros pontos sobre arquitetura de software você encontra nos meus treinamentos pagos!
http://andrebaltieri.net/#/

Se você gostou, confere esta implementação na prática neste meu repositório no GitHub
https://github.com/andrebaltieri/mwa-api

Este repositório faz parte do treinamento Modern Web Apps
http://modernwebapps.net/

 

Abraços,

Lançamento do Visual Studio 2015

Em 20 de julho, iremos celebrar a última release do Visual Studio 2015! Convidamos a todos a aprender sobre as novas features e tecnologias que acompanharão a nova versão. Você poderá interagir na sessão ao vivo, participar da sessão de perguntas e respostas com o time de engenharia, além de se aprofundar em detalhes técnicos, em mais de 60 sessões on-demand. Para acessar, clique aqui.

Teremos também a oportunidade de ver o time de Visual Studio criando uma solução fim-a-fim em um projeto open-source, alavancando as mais novas ferramentas e tecnologias. Veja como eles lidam com os mais diferentes cenários e tire suas dúvidas.

Participe do lançamento no dia 20 de julho, clicando aqui. Não é necessário fazer o registro, apenas acesse a URL no dia 20 de Julho, a partir das 12h30 (horário de Brasília). Siga @visualstudio e acompanhe as novidades.

Compartilhe conosco a sua experiência usando a hashtag #visualstudiortm

Minhas palestras no TDC SP

O TDC com certeza é um dos maiores eventos de desenvolvimento do Brasil! Contando com vastas trilhas e ótimos palestrantes, é uma honra para mim, ter minhas palestras aprovadas pelo quarto ano consecutivo para o evento!

O TDC São Paulo acontece dos dias 21 à 25 de Julho na Universidade Anhembi Morumbi, conta com várias trilhas e várias tecnologias, dentre elas Web e .NET nas quais estarei palestrando.

Na trilha de Web, vou falar sobre Real-time apps com AngularJS e Firebase, que é um assunto que cresce a cada dia mais!

Na trilha de .NET, estarei com meu fiel companheiro MacAir mostrando como ficou o desenvolvimento de aplicações Web com ASP.NET na plataforma da Apple.

Além do conteúdo técnico, sempre tem o networking, então, se estiver por lá, passa lá me conhecer, ou seja já me conhece, passa dar um “oi”!

Para maiores informações sobre o TDC consulte o site oficial:
http://www.thedevelopersconference.com.br/tdc/2015/saopaulo/trilhas

Abraços,