Postagens

Mostrando postagens de 2012

Versão 1.0.1 do NHilo!

Hoje o post é para falar que está disponível a primeira versão estável da biblioteca NHilo ( http://nhilo.codeplex.com/ ), componente para se gerar chaves primárias utilizando o algoritmo hilo do NHibernate! As mudanças que ocorreram entre a versão beta e esta são: Inclusão de providers para trabalhar com MySQL e Oracle. Criação de um método de extensão para retornar um valor inteiro de 32-bits ao invés de um inteiro de 64-bits. Mudanças de algumas classes para o namespace raiz. Correção de alguns bugs referentes ao schema de configuração. Por enquanto é só. A biblioteca pode ser baixada tanto nosite do Codeplex quanto pelo Nuget ( www.nuget.org ). []'s

Usando o padrão Decorator (GoF)

Imagem
O padrão Decorator, do livro Design Patterns: Elements of Reusable Object-Oriented Software , é útil quando precisamos adicionar um comportamento em uma classe já existente. Vamos demonstrar isso através de um exemplo de uma classe de acesso ao banco de dados onde será adicionado o uso de cache. Primeiro temos  nossa classe que acessará o "banco de dados". Na verdade, a nossa base nada mais é que um array em memória. Optei por fazer assim para manter a simplicidade do exemplo e focarmos no que realmente é importante. Além disso, a busca demora propositadamente 3 segundos para simularmos todo o trabalho de se acessar um recurso externo à aplicação como um banco de dados. // RepositorioConfiguracaoImpl.cs using System.Collections.Generic; using System.Threading; namespace ExemploDecorator { public class RepositorioConfiguracaoImpl : IRepositorioConfiguracao { private readonly Dictionary<string, string> _configuracoes = new Dictionary<string, str

NHiLo - Gerador de chaves primárias (substitutas)

Imagem
Hoje subi pela primeira vez um pacote Nuget para o seu repositório oficial. Trata-se de um pequeno componente de código aberto que eu fiz para permitir a geração de chaves primárias para registros sem a dependência do banco de dados para isso. Leia-se: NÃO PRECISAR MAIS DE COLUNAS DE AUTO-NUMERAÇÃO COMO IDENTITY. O uso de colunas do tipo identity são uma das poucas coisas que eu torço o nariz sem antes saber o motivo porque foi escolhido essa abordagem para chaves substitutas. Não gosto porque esse tipo de campo dificulta se precisarmos manter bases sincronizadas, pois o ID da coluna pode ser diferente em cada uma delas. Este componente é uma implementação isolada do algoritmo HiLo, famoso no NHibernate. Não é nada novo no mundo do desenvolvimento (e todo o crédito para os desenvolvedores do Hibernate/NHibernate), mas que não encontrei uso disponível fora desse framework de ORM. Inclusive esse foi o motivo de eu criá-lo: poder usar o HiLo em uma situação que eu não posso traba

Por que tá dando erro?

Hoje um colega de trabalho me mandou o seguinte código, trecho de um teste de unidade. var objeto = null; Assert.IsNull(objeto.atributo); O questionamento era "por que tá dando erro?". Que coisa, né? Tá dando erro... []'s

Injeção de Dependência em ASP.NET Webforms

Muito do material que vemos pela Internet a respeito de Inversão de Controle e Injeção de Dependência está relacionado ao ASP.NET MVC. Hoje o meu objetivo aqui é mostrar como fazer uso de um contêiner de IoC com o "patinho feio" do ASP.NET, o Webforms. Mas antes, vamos contextualizar o que é Inversão de Controle e Injeção de Dependências. Inversão de Controle é um conceito de programação onde é tirada a responsabilidade de uma classe em criar as suas dependências. Vejamos o código abaixo. Nele, a página ASP.NET (que é uma classe) instancia uma classe chamada SaudacaoPTBr e chama seu método Saudar para retornar uma informação qualquer. Por isso, esta página depende de SaudacaoPTBr. Perceba que para utilizar essa dependência, a página ASP.NET teve que, no seu próprio código, criar um objeto do tipo SaudacaoPTBr. public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { var saudacao = new SaudacaoPTBr();

Paginação de registros no SQL Server

Imagem
Hoje vou comentar uma solução para paginar dados no SQL Server. A paginação é útil quando precisamos retornar uma grande quantidade de informações pouco à pouco. Vamos supor que tenhamos que trafegar 100.000 registros através de uma chamada de web service. Dependendo da rede e do tamanho dos dados, podemos ter problemas se tentarmos passar todos esses dados de uma vez só (problemas do tipo cair a rede no meio da transferência e perdermos todo o trabalho). Ao invés disso, podemos tentar passar 5.000 em 20 vezes, ou seja, em 20 páginas. Isso também é válido quando precisamos apresentar muita informações na tela do usuário, e ao invés de trazer todos os registros, trazemos eles pouco à pouco de forma que permita a análise da pessoa. Nas situações acima, poderíamos carregar todos os registros em memória e nós mesmos fazermos a paginação, só que isso é ruim visto que vamos alocar todas as informações na memória sendo que só iremos utilizar uma pequena fração dela. Para resolver

"Sacaneando" a OOP - chamando métodos não públicos em .NET

Imagem
Olá, pessoal. Hoje vou demonstrar aqui como burlar as regras da Orientação a Objetos em relação ao escopo, ou seja, conseguir chamar um método privado fora da sua classe, por exemplo. A ideia desse post veio de uma necessidade que tive em acessar o conteúdo do viewstate de uma página ASP.NET a partir de um user control. ViewState é um artifício criado para o ASP.NET Webforms para se permitir simular a manutenção de estado entre as várias requisições à páginas web (visto que tradicionalmente a abordagem de trabalho com web é stateless). Vamos dar um exemplo. Suponha que eu tenha um grid em uma página ASP.NET, e então eu queira definir uma ordenação para uma coluna qualquer desse grid. Logicamente, na próxima vez que eu quiser fazer uma requisição para essa página, vou querer que essa ordenação que eu fiz continue. É nesse caso que entra o viewstate, pois será nele que essa informação de ordenação será armazenada. Na prática, o viewstate é um campo do tipo hidden, no qual o

"Novidades" no Visual Studio 11 Beta - Microsoft Fakes

Imagem
Olá, pessoal! Hoje vou falar de uma das "novidades" que vieram na versão beta do Visual Studio 11: Microsoft Fakes. O Fakes é um framework de geração de objetos dublês para testes, ou seja, ele serve para criar classes que possam substituir outras para facilitar a execução de testes de caixa branca. Testes de unidade devem verificar apenas o comportamento da classe que estão testando, e não de várias classes. Por exemplo, se para testar uma classe de negócio precisamos da sua classe de dados, para retornar algumas informações, então isso não é um teste de unidade... É mais fácil mostrar a utilidade do Fakes com um exemplo. Antes de tudo, você deve baixar a versão beta do Visual Studio 11 neste link  http://www.microsoft.com/visualstudio/11/en-us . Como exemplo, eu criei um projeto do tipo "Unit Test Project", para C#. Vou colocar o próprio código da classe de negócios que será testada neste projeto. Numa solução real, isso não poderia ser feito, mas com

Annoying Manager

Olá, pessoal. Há algum tempo eu vinha querendo criar alguma coisa e disponibilizar como código aberto. Hoje finalmente fiz isso, e o fiz com uma idéia de aplicativo que eu tive lá por 2004, mas nunca cheguei a concluir: uma ferramenta para ajudar a controlar as atividades que vou fazendo durante o dia, algo que me forçasse a manter um histórico de tudo o que vou fazendo. Na época esse aplicativo iria se chamar "C.H.A.T.O", que era um acrônimo de "Controle de Horários, Atividades e Tarefas Operacionais" (sim, forcei para que pudesse ser um acrônimo com sentido, rs). Hoje essa ferramenta se chama Annoying Manager (Gerente "Pentelho"), e está disponível no Codeplex, site de projetos abertos mantido pela Microsoft. O endereço é http://codeplex.com/annoyingmanager/ . A idéia é a seguinte: um aplicativo que executa em segundo plano e de tempos em tempos aparece para questionar o que você está fazendo no exato momento. Você dá uma descrição da atividade para

Relato de Caso: Uso de cache em aplicação ASP.NET

Imagem
Olá, pessoal. Hoje vou falar sobre cache, mas quero fazer algo diferente dos muitos materiais que se encontra na Internet. Não numa visão de codificação prática, mas sim conceitualmente, explicando o resultado que tive ao implementá-lo em uma aplicação ASP.NET que possuía sérios problemas de desempenho. Primeiramente, qual é o conceito de cache? A idéia do cache é ter uma cópia de um conjunto de dados para acesso rápido. Dessa forma não oneramos o repositório original, cujo acesso é mais lento que o cache, ao fazer buscas. A seguinte imagem mostra como um algoritmo de cache comumente é feito. Alguém faz uma requisição ao cache, buscando determinada informação. Caso essa informação não exista no cache, ele vai ao repositório original para carregá-la e o insere no cache. A partir disso, qualquer busca por esta informação no cache vai trazer o dado armazenado, ao invés de efetuar a pesquisa no repositório “lento”. A vantagem do cache está em melhorar o desempenho de pesquisas. O pri

Criando e testando objetos com construtores privados

Imaginem a seguinte situação. Temos uma classe qualquer. Essa classe possui uma dependência. Além disso, vamos supor que a criação desse objeto seja uma coisa complexa, ou seja, não podemos simplesmente deixar que essa classe seja instanciada por um new. // MeuObjeto.cs public class MeuObjeto { public IMinhaDependencia Dependencia { get; set; } internal MeuObjeto() { // internal para garantir que apenas // a factory possa criar este objeto } public int RetornarCalculo(int a) { return Dependencia.Calcular() + a; } } // IMinhaDependencia.cs public interface IMinhaDependencia { int Calcular(); } Temos então uma classe factory para criar uma instância desse objeto. Problema resolvido, correto? Se eu precisar de uma instância dessa classe, simplesmente chamo sua factory. // MeuObjetoFactory.cs public class MeuObjetoFactory { public MeuObjeto

ORA-01843: not a valid month

Imagem
Estou aqui de novo para comentar problemas relacionados ao desenvolvimento com Oracle, e como eles foram resolvidos. Na equipe que trabalho entrou uma pessoa nova, e precisamos instalar o cliente do Oracle para que ele pudesse trabalhar. Após feita a instalação do Oracle Instant Client , quando ele começou a executar o sistema na sua máquina, o seguinte erro apareceu: ORA-01843: not a valid month . Detalhe que quando a mesma rotina era executada na minha máquina, eu não tinha esse problema. Após algumas pesquisas, identificamos a causa. No banco de dados que estamos utilizando, a configuração de formato de data está parametrizado para dia/mês/ano: select * from nls_database_parameters; NLS_LANGUAGE                          AMERICAN NLS_TERRITORY                          AMERICA NLS_CURRENCY                          $ NLS_ISO_CURRENCY                  AMERICA NLS_NUMERIC_CHARACTERS  ., NLS_CHARACTERSET                  WE8ISO8859P1 NLS_CALENDAR    

TransactionScope e Invalid operation. The connection is closed no Oracle

Tudo na vida acontece por uma razão, e quando a gente não entende a razão considera que é magia. Digo isso por um problema que estava tendo em uma aplicação ASP.NET que usa banco de dados Oracle. Em determinada funcionalidade, um processamento com gravação, ocorria um problema que impedia a gravação dos registros. O erro era: System.InvalidOperationException: Invalid operation. The connection is closed.    at System.Data.OracleClient.OracleConnection.GetOpenInternalConnection()    at System.Data.OracleClient.OracleConnection.get_ErrorHandle()    at System.Data.OracleClient.OracleDataReader.ReadInternal()    at System.Data.OracleClient.OracleDataReader.Read()    at Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleDataReaderWrapper.Read() Simplesmente eu não entendia a causa desse erro ( neste momento chamado de "magia"), pois o código que rodava essa consulta (sim, consulta, pois você pode ver que na stacktrace estamos usando o DataReader do OracleClient) funci

Mau uso do TryParse...

Abaixo está uma pérola onde vemos o uso incorreto do método TryParse. Temos uma string, lida de um arquivo, que contém informação de data, e é necessário colocá-la em um objeto do tipo DateTime. Veja como foi feito abaixo. public DateTime ObterDataControle() { DateTime dt = DateTime.MinValue; if (File.Exists(_caminhoArquivo)) { StreamReader sr = new StreamReader(_caminhoArquivo); try { string dateString = sr.ReadLine(); if (DateTime.TryParse(dateString, out dt)) dt = Convert.ToDateTime(dateString); } finally { sr.Close(); } } return dt; } O método TryParse retorna um bool, que indica se foi possível converter a string para o determinado tipo. Só que quando é possível efetuar a conversão, este método já coloca o valor no parâmetro que ele recebe de output. Não é necessário fazer (como foi feito no código) uma nova conversão do valor. A linha  dt = Convert.T

Impressões da 70-512

No final do ano passado (alias, feliz 2012 para todos!) eu fiz a prova de certificação da Microsoft 70-512, de administração do TFS. Felizmente ocorreu tudo ok, e eu passei! E agora vou colocar neste espaço aqui alguns comentários e impressões que eu tive dela, para servir de dica para que irá fazê-la em breve. Bom, em primeiro lugar, eu vou passar como eu me preparei para a prova: Antes mesmo de pensar em fazer essa prova, eu tive oportunidade de assistir um treinamento de ALM com meu amigo Victor Cavalcante . Boa parte do conteúdo deste treinamento caiu na prova. Se tiverem oportunidade, procurem algum treinamento com pessoal capacitado como ele. Já quando eu estava com a idéia de fazer a prova (meta da empresa), eu encontrei o livro Professional Team Foundation Server 2010 . É um bom livro, apesar que eu achei que algumas partes deixaram a desejar, como a parte de Lab Management e configuração de servidores Proxy do TFS. Mas a visão geral da parte de instalaç