Postagens

Mostrando postagens de Março, 2012

"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 como é apenas um…

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 ele, e e…

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 principal de…

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 Criar…

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                        GREGORIAN NLS_DATE_FORMAT         …

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) funcionava de forma i…