Esse artigo faz parte da revista .NET Magazine edição 56. Clique aqui para ler todos os artigos desta edição

 

lass=Topico style="MARGIN: 0cm 0cm 0pt">Boas práticas - Expert

Conhecendo o PostSharp

Mais funcionalidades com menos código

 

Neste artigo veremos

·         Conceitos de AOP;

·         Funcionamento da ferramenta PostSharp.

Qual a finalidade

·         O PostSharp é uma ferramenta que minimiza a codificação e melhora o design dos sistemas, utilizando conceitos de AOP.

Quais situações utilizam esses recursos?

·         Pode ser utilizado para programar funcionalidades de log, transação, segurança, cache, entre outras, de maneira modularizada e mais produtiva.

 

Resumo do DevMan

         Utilizando a Programação Orientada a Aspectos, podemos construir sistemas de forma mais rápida e com uma arquitetura melhor desenhada. Uma das ferramentas que trabalha dessa forma é o PostSharp.

 

Imagine que você precisasse implementar uma funcionalidade de log em todos os métodos de todas as classes de negócio do último projeto que você tenha trabalhado, gravando a quantidade que cada método é executado durante o dia e quais os parâmetros passados com maior freqüência. Imagine que você tenha muitas classes para embutir esta funcionalidade, e que você tenha pouco tempo para fazer a codificação. Esta é uma situação que ocorre muitas vezes e que pode nos tirar horas e horas de trabalho, implementando código repetitivo.

Agora imagine que você possa fazer todo esse trabalho sem ter que alterar as suas classes de negócio, apenas incluindo uma linha de código no projeto do componente que contém as classes e compilá-lo novamente. Parece bem mais interessante, não acha? Mas é possível? Sim, é possível, desde que sejam utilizadas as técnicas e ferramentas apropriadas.

Podemos utilizar conceitos da Programação Orientada a Aspectos, ou AOP (do inglês, Aspect Oriented Programming), para adicionar funcionalidades às classes e métodos existentes, sem a necessidade de alterá-los um por vez. E uma das ferramentas que nos dá essa possibilidade é o PostSharp.

Construído sob o .NET Framework 2.0 mas com suporte total às versões 3.0 e 3.5, o PostSharp é uma ferramenta open source para a análise e transformação de assemblies .NET, possibilitando a alteração do código IL e conseqüentemente modificando o comportamento das classes e métodos. Além de uma maior produtividade, ela permite um design mais limpo, uma vez que as funcionalidades podem ser separadas de maneira mais clara dentro do sistema.

Neste artigo, iremos entender como o PostSharp funciona e os principais conceitos da AOP, além de programar algumas funcionalidades utilizando o plugin nativo PostSharp Laos.

 

Antes de começar, um exemplo…

Antes de explicar os conceitos e o funcionamento do PostSharp, vamos criar um exemplo simples para demonstrar o que podemos fazer com essa ferramenta. A idéia é mostrar como incluir uma funcionalidade em uma aplicação já existente, com uma quantidade mínima de codificação.

O primeiro passo é baixar e instalar o PostSharp. O setup de instalação está disponível em www.postsharp.org/download. Ao utilizar o instalador, o PostSharp  já se integra ao Visual Studio automaticamente, deixando-o pronto para uso.

No nosso exemplo, vamos considerar uma aplicação do tipo Console, que efetua a divisão de dois números. A Listagem 1 mostra a nossa aplicação de exemplo.

 

Listagem 1. Aplicação de exemplo sem uso do PostSharp

using System;

using System.Collections.Generic;

using System.Text;

 

namespace ExemploSimplesPostSharp

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Informe dois números para divisão:");

            decimal a = Convert.ToDecimal(Console.ReadLine());

            decimal b = Convert.ToDecimal(Console.ReadLine());

            Console.WriteLine("O resultado é {0}", Dividir(a, b));

        }

 

        private static decimal Dividir(decimal a, decimal b)

        {

            return a / b;

        }

    }

}

 

É uma aplicação simples, que lê dois valores fornecidos pelo usuário, e os passa para o método Dividir, que então retorna o resultado da divisão desses dois números. O que vamos fazer agora é incluir um tratamento de erro padrão para os métodos dessa classe.

O primeiro passo é adicionar duas novas referências ao projeto: PostSharp.Public (C:\Program Files\PostSharp 1.0\PostSharp.Public.dll) e PostSharp.Laos (C:\Program Files\PostSharp 1.0\PostSharp.Laos.dll). Elas podem ser adicionadas pelos componentes .NET apresentados na janela Add Reference.

O próximo passo é criar uma nova classe herdada de System.Attribute, que será utilizada para “marcar” o método que terá o tratamento de erro injetado, conforme o exemplo a seguir:

 

[AutoException]

private static decimal Dividir(decimal a, decimal b)

{

    return a / b;

}

 

Nota do DevMan

Atributos são classes herdadas de System.Attribute que permitem adicionar informações a tipos, métodos, assemblies, propriedades etc. Estas informações podem ser recuperadas posteriormente para que os elementos marcados com estes atributos possam ser tratados de maneira diferenciada. Por exemplo, classes marcadas com o atributo Serializable indicam que elas podem ser serializadas.

 

No entanto, para facilitar o desenvolvimento do atributo, o PostSharp provê algumas classes que, além de herdarem de System.Attribute, já possuem métodos que podem ser utilizados para a alteração de código, injetando a funcionalidade que você definir. E para o nosso caso, utilizaremos a classe PostSharp.Laos.OnMethodBoundaryAspect. A Listagem 2 exibe nosso atributo, que irá incluir o código de tratamento de erro automaticamente nos métodos onde ele for aplicado.

 

Listagem 2. Atributo para tratamento de erro

using System;

using System.Collections.Generic;

using System.Text;

using PostSharp.Laos;

 

namespace ExemploSimplesPostSharp

{

    [Serializable]

    public sealed class AutoExceptionAttribute : OnMethodBoundaryAspect

    {

        public override void OnException(MethodExecutionEventArgs eventArgs)

        {

            ConsoleColor cor = Console.ForegroundColor;

            Console.ForegroundColor = ConsoleColor.Red;

            try

            {

                Console.WriteLine("ERRO AO EXECUTAR MÉTODO {0}.", eventArgs.Method.Name);

                object[] parametros = eventArgs.GetReadOnlyArgumentArray();

                if (parametros.Length > 0) ...

Quer ler esse conteúdo completo? Tenha acesso completo