domingo, 5 de março de 2017

Padrão de Repositório no C#

O artigo .NET - Apresentando o padrão de projeto Repository do Macoratti faz uma breve explicação do padrão de repositório e apresenta exemplos de códigos c# para implementá-lo.

O vídeo abaixo  Repository Pattern with C# and Entity Framework, Done Right do canal Programming with Mosh faz um detalhamento maior, confrontando ideias encontradas na internet e também foi utilizado como fonte para este post.


Repositório, de acordo com de Martin Fowler, tem por definição:
Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.
Media entre as camadas de domínio e mapeamento de dados usando uma interface tipo coleções para acessar objetos de domínio (Tradução livre do autor do post)

Os benefícios ao usar este padrão são:
  1. Minimiza duplicações de lógicas de consultas(query)
  2. Desacopla sua aplicação de frameworks de persistência. Dessa forma você pode começar com o acesso a dados com o Entity Framework e depois mudar para o Dapper em caso de necessidade de melhor performance (como dito no post  Acesso a Dados e Desempenho)
  3. Deixar o código mais testável

Alguns erros comuns de desenvolvedores

1 - Repositório não deve repetir métodos do banco de dados

Um repositório não deve espelhar métodos de um banco de dados. Por exemplo, a atualização de um objeto deve ser feita apenas atualizando o objeto consultado. A persistência no banco de dados deve ser feita com o Unit Of Work.

O Martin Fowler define o Unit of Work como:
Maintains a list of objects affected by a business transaction and coordinates the writing out of changes and the resolution of concurrency problems.
Mantém uma lista de objetos afetados por uma transação de negócio e coordena a escrita de mudanças e resoluções de problemas de concorrência (Tradução livre do autor do post)
O autor do vídeo defende que se devee evitar o retorno de IQuery no repositório, para forçar a criação de métodos específicos para a busca de dados e ter o benefício número 1 - este padrão não é respeitado no código do Aspnet Boilerplate.  Ele também defende que a definição do Lazy ou Eager Loading também deve ser feita internamente no repositório e exposto a camada de negócio em métodos específicos.

2 - Nem toda aplicação deve usar este padrão

Deve-se tomar o cuidado para não fazer o over engineering (usar mais detalhes de arquitetura que o problema precisa). Se estiver prototipando ou um código que provavelmente não irá para a produção, talvez não precise desse investimento neste padrão.

 Código

O código utilizado no vídeo está disponível neste link para download.
Neste link está documentada a implementação de repositório do Aspnet Boilerplate.


No vídeo também é indicado o livro

Clean Code: A Handbook of Agile Software Craftsmanship do autor Robert C. Martin

quarta-feira, 1 de março de 2017

Configurando o TypeScript com o Angular

Os benefícios de se utilizar o TypeScript foram falados nos posts Introdução ao TypeScript  e Configuração Gulp para trabalhar com TypeScript. Mas configurar o TypeScript com o Angular 1 demanda uma sequência correta de etapas.

O ambiente javascript evoluiu muito nos últimos anos, tanto em relação ao poder quanto à complexidade. Há um discussão sobre o tema muito interessante no podcast  .NET Rocks #1387 JavaScript Development Environments with Cory House. A ideia de ter o ambiente Javascript bastante aberto à diferentes pacotes dá margem para aparecer pacotes oferecendo serviços melhores que os já existentes, mas ao mesmo tempo pode paralisar o desenvolvedor que está se iniciando no ambiente novo – que pode preferir num primeiro momento repetir a escolha de um especialista.

O repositório “Browserify-TypeScript-Angular-Gulp—Boilerplate” do Git fez um excelente Boilerplate (entenda como facilitador para você iniciar seus projetos neste contexto) que além de merecer estrelas, merece um post só sobre ele.

Neste repositório foi configurado vários pacotes, à se destacar:

  • Browserify
  • TypeScript
  • Angular (1)
  • Gulp

Depois do repositório clonado, basta executar os comandos abaixo, conforme readme.md, para baixar as dependências:

npm install 
bower install 
 

O repositório tem dois branches

  1. master com um exemplo de CRUD
  2. “no-demo-app” com o bolierplate apenas.

Para executar o CRUD de exemplo, com o Node.js como backend, basta executar:

gulp serve

Configuração Gulp para trabalhar com TypeScript


Este passo a passo irá configurar o Gulp para automatizar suas tarefas relacionadas ao typescript. Todo o fonte utilizado está disponível no projeto introducao-typescript do github. Nesse exemplo será separado diretórios de fontes (neste exemplo, '/src') do de distribuição ('/dist').
  • [raiz]
    • dist
    • src
   
Para iniciar o projeto, no diretório raiz, basta executar o comando abaixo na linha de comando:
npm init

Selecione todas as opções padrões e para o entry point digite './dist/main.js'

Ao terminar será criado o arquivo packages.json na raiz da aplicação, que facilita atualização e restauração dos pacotes NPM no projeto.

Instalando dependências e configuração básica

Será necessário instalar o Gulp CLI (de forma global), o que pode ser feito com o comando abaixo:
npm install -g gulp-cli

Depois instale typescript, gulp e gulp-typescript nas dependências de projeto:
npm install --save-dev typescript gulp gulp-typescript

Defina as configurações do typescript no arquivo tsconfig.json na raiz da aplicação (Para ver mais informações de todas as opções consulte a documentação).
Para ver um exemplo de configuração, veja este exemplo no github:
Crie o gulpfile.js também na raiz da aplicação. Ele será responsável pela tarefa de executar o typescript
Tudo pronto! Depois basta executar o comando abaixo que irá transpilar o typescript para javascript no "target" definido do tsconfig.json.
gulp TypescriptTranscript
Veja o exemplo de um arquivo TS:
E o arquivo JS gerado:

Configurando o Browserify

O browserify permitirá você definir um arquivo de entrada e baseado em suas referências será feita a transpilação automaticamente de toda árvore que se referencia.

Instale o plugin browserify, tesify e vinyl-source-strem, para juntar todos os modulos em um único arquivo.
npm install --save-dev browserify tsify vinyl-source-stream

Com a configuração abaixo do gulpfile.js o arquivo de entrada é utilizado para buscar todas as dependências e gerar um novo arquivo .js. Ao executar o comando abaixo é utilizado o arquivo 03BrowserUsage.ts, visto a dependência 01Basic.ts e gerado o arquivo bundle.js
gulp browserify

Já ficou interessante, mas ainda é preciso executar o comando para transpilar. Vamos agora configurar para a compilação acontecer automaticamente quando os arquivos tiverem alteração com o watchify.
Instale os plugins watchify e gulp-util:
npm install --save-dev watchify gulp-util

Para entender o Browserify veja este link:
https://benclinkinbeard.com/posts/how-browserify-works/
O browserify utiliza um arquivo de entrada, para descobrir todas as dependências e gerar um empacotamento de javascript. Ele também resolve o uso de recursos produtivos do Node.js que não existem para o browser – que é o uso de módulo por exemplo. O uso do require tão comum no Node.js não existe para o javascript no browser. O Browserify implementa um tipo de require interpretando este javascript. O mesmo é feito para o exports.
Desta forma você pode criar seu javascript modularizado, até mesmo usando o typescript, e ainda assim conseguir transformar em um javascript entendível pelo navegador.
Referência
https://www.typescriptlang.org/docs/handbook/gulp.html