O Postmon e uma api REST construida em Python e MongoDB para consulta de CEP e encomendas.Nessa apresentacao do InfoQ Ale Borba conta a historia da criacao da API.Site da API: http://postmon.com.br/ Eu utilizo Extensions Methods para praticamente duas finalidades: Implementar uma funcionalidade nao existente para um objeto; Dar uma maior coesao a um trecho de codigo; Como exemplo de coesao, veja o trecho de codigo abaixo: Para deixar o codigo um pouco mais coeso pode implementado da seguinte forma: Para criar uma classe que implemente o codigo que queremos e muito simples: Agora pra utiliza-lo basta fazer o seguinte: Pois e, o Visual Studio ja me avisou que nao encontrou o meu metodo de extensao. Isso se da por que esqueci de fazer o using para o namespace onde esta a extensao, e isso aconteceu por que o intellisense nao me deu essa opcao.Quando criamos um extension method dentro de uma namespace precisamos lembrar de fazer o using manualmente toda vez que queremos utiliza-lo, o que nem sempre e legal. O que podemos fazer nesse caso? Duas opcoes: Nao definir uma namespace para a sua classe que contem os metodos de extensao; Definir o namespace igual ao objeto ao qual o metodo esta atrelado. Fica ai a dica, agora e so mandar bala nos extensions methods. Em um post anterior eu evidenciei uma tendencia de seencapsular frameworks em classes da propria aplicacao. Dei uma atencao especialao padrao Repository utilizado com ORMs, e nesse post resolvi destacar outros problemas que podem ocorrercom esse padrao.Nem sempre e facil identificar a responsabilidadeQuando estamos definindo os metodos do repositorio os metodos basicos sao faceis de definir:GetById;Save (InsertOrUpdate);Delete;GetBy(Filter filters);Vamos pegar um cenario onde voce tenha um classe Customer e a classe Sale tendo cada uma delas a sua devida implementacao do Repository.Agora imagine um item do seu dashboard onde voce exibe o total de vendas dos clientes:Em qual repository voce colocaria a implementacao dessa consulta? Customer ou Sale?Funcionalidades que requerem consultas e escritas no banco de dados que cruzam as fronteiras estabelecidas pelo padrao e algo muito comum. Quando surgem cenarios desse tipo alguns utilizam estrategias que podem degradar a performance da aplicacao como o Select N+1.Dificuldade para resolver problemas de PerformanceO Select N + 1 significa que voce foi mais de uma vez no banco de dados para obter dados, no exemplo acima tivemos as seguintes requisicoes no banco de dados.Obtem todos os clientes;Quando acionada a propridade Sales de o sistema foi no banco para obter as respectivas vendas, ou seja, se tivermos 10 clientes o sistema ira 10 vezes no banco buscar as vendas de dos clientes;Ate aqui esses problemas reportados nao e culpa do padrao + ORM mas so do padrao. Com os repositories nos nao conseguimos customizar o retorno do banco de dados para necessidades especificas, ate por que isso foge um pouco das responsabilidades do padrao.Como uma solucao pra esses tipos de problemas muitospreferem expor recursos do ORM pelo Repository, como exemplo:Enable/Disable Lazy Loading;Multi Queries;Operacoes em Batch;O problema que isso se torna um vazamento da abstracao que o Repository se propoe