Inscrições abertas para o .NET Architects Day 2009

30/05/2009 22:12

O site para as inscrições do .NET Architects Day 2009 está disponível no seguinte endereço:

http://www2.dotnetarchitects.net/dnawww2/registroDNAD2009/

O processo de inscrição é rápido e simples! Para mais informações do evento, incluindo a grade de palestras e a localização, vejam no link a seguir:

http://www.dotnetarchitects.net/dnad2009

.Net Architects, Arquitetura, Eventos , , , ,



Décimo encontro do grupo .Net Architects

28/05/2009 22:06

Neste sábado estarei apresentado uma palestra no décimo encontro do .Net Architects com o tema "Injeção de dependência com Unity (Enterprise Library)”, maiores informações estão disponíveis no site do grupo.

Como de costume, a reunião será gravada e também transmitida via Live Meeting, para quem não puder comparecer pessoalmente. O horário e local também permanecem os mesmos: UNIP do Jaguaré/Cidade Universitária, as 10h.

Segue o link para acesso via Live Meeting, contudo somente no sábado, dia 30 de maio, à partir das 9h15 a transmissão estará disponível.

https://www.livemeeting.com/cc/usergroups/join?id=BH8CBN&role=attend&pw=J%7D%25%26s%7E%3EG5

Espero você lá!

.Net Architects , ,



.NET Architects Day 2009

24/05/2009 00:01

 

Convido a todos os interessados em arquitetura de software a participarem do primeiro evento do grupo .NET Architects.

Qual a idéia do evento:

  • Temas apresentados por membros ativos do grupo e MVP's;
  • Apresentações focadas na experiência dos palestrantes, e não somente na tecnologia;
  • Interação com a comunidade;
  • Sorteio de brindes (DVDs VSTS, Livros, Camisetas, entre outros);
  • Temas focados em arquitetura de soluções;
  • Oportunidade de interagir com outros arquitetos de software e interessados no assunto.

Temas a serem apresentados:

Informações completas sobre o evento você encontra aqui. Espero por você lá!

.Net Architects, Arquitetura, Eventos , , , ,



Dois dias de Engenharia de Software Conference e meus dois centavos

23/05/2009 22:50

Terminou hoje a Engenharia de Software Conference, e como comentei aqui, tive a oportunidade de assistir palestras muito interessantes, sob diversos aspectos. O evento contou com três salas com palestras simultâneas, e como haviam alguns amigos do .Net Architects presentes ficou fácil trocar informações sobre as palestras em tempo real (cheguei a mudar de palestra após uma troca de torpedos).


Dia 1

No primeiro dia tivemos como tema da palestra de abertura o Programa MPS.BR (uma espécie de CMMi Brasileiro). Haviam muitos “agilistas” na platéia e algumas perguntas sobre utilização do modelo MPS.BR com métodos ágeis criaram alguns momentos desconcertantes que,  somados a outras afirmações da palestrante repercutiram com comentários divertidos em outras palestras.

Como já tenho o CSM, optei pela palestra do Carlos Eduardo Vazques da FATTO Consultoria que falou sobre estimativa de software e não me arrependi. Também assisti a palestra do Marcos Kalinowski sobre qualidade através de revisões de software, mas achei que a palestra focava muito em documentação.

Após o almoço com a galera assisti a palestra da simpática Cidinha Gouveia que falou sobre Estruturas Organizacionais de Teste apresentando um caso real, bem interessante, mas faltou tempo para comentar mais sobre o case. A palestra mais esperada era a do Fábio Câmara, que gerou muita polêmica após sua participação no Scrum Ghatering, mas fomos avisados na última hora que a palestra seria transferida para o segundo dia. No lugar falou o Dairton Bassi sobre XP na prática.


Dia 2

A primeira palestra que escolhi foi sobre boas práticas de teste de software com a Cidinha Gouveia, aliás, os grandes temas do evento na minha opinião foram testes e agile. Em seguida não podia deixar de conferir a palestra do Alexandre Magno falando sobre as atribuições do Product Owner num projeto agile com Scrum, na minha opinião a melhor palestra do evento, disparada.

Depois do almoço (a comida esfriou na longa fila dos caixas que se formou no restaurante) foi a vez do Fábio Câmara repetir a palestra polêmica do Scrum Gathering mas dessa vez com explicações sobre o seu ponto de vista. Acredito que esse assunto ainda vai dar muito o que falar, pois os pontos de destaque da palestra destoam da forma como a Scrum Alliance prega o framework.

Na seqüência tivemos o Juan Esteban Bernabó desmistificando Scrum e Agile numa ótima palestra, enfocando os diversos aspectos humanos presentes na nossa profissão. E para encerrar o Fabiano Milani falando sobre Scrum e a elaboração de um product backlog com qualidade e garantia de ROI numa ótima palestra!

O pessoal do .Net Architects que estava presente no evento lotou com várias mensagens o Twitter comentando sobre os momentos mais emocionantes e divertidos, confira, vale a pena: Giovanni Bassi, André Dias, Victor Cavalcante, Raphael Molesin e Rafael Rosa.

Na minha opinião, ficou evidente que agilidade é uma realidade, quem se preparar agora sofrerá menos depois. O evento também foi uma oportunidade de networking muito rica, tive a chance de conversar com vários palestrantes sobre os temas discutidos e trocar muitas opiniões com os amigos presentes. Enfim, me diverti muito!

Eventos ,



EntLib (parte 7) – Configurando InterceptionExtension no Unity

17/05/2009 23:45

No meu último post da série sobre a Enterprise Library expliquei como podemos utilizar a extensão de biblioteca InterceptionExtension do Unity para aplicar interceptação na chamada da interface ILogger aplicando uma característica AOP no container. O exemplo levava em consideração que a definição fosse realizada em tempo de execução. Veremos agora como podemos modificar o exemplo anterior colocando todas as definições no arquivo de configuração da aplicação.

Dentro do arquivo de configuração, adicione dentro da sessão typeAliases os tipos descritos abaixo:

<typeAliases>
 
    ...

    <typeAlias 
        alias="GUIDAttribute" 
        type="Reverb.Handlers.GUIDAttribute, Reverb.InterceptionSample" />
    <typeAlias 
        alias="GUIDHandler" 
        type="Reverb.Handlers.GUIDHandler, Reverb.InterceptionSample" />
    <typeAlias 
        alias="interface" 
        type="Microsoft.Practices.Unity.InterceptionExtension.InterfaceInterceptor, Microsoft.Practices.Unity.Interception, Version=1.2.0.0" />
</typeAliases>

Em seguida adicione um novo container dentro da sessão Containers, conforme descrito abaixo:

<container name="InterfaceInterceptionContainer">
    <extensions>
        <add type="Microsoft.Practices.Unity.InterceptionExtension.Interception, Microsoft.Practices.Unity.Interception" />
    </extensions>
    <extensionConfig>
        <add name="interception"
            type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationElement, Microsoft.Practices.Unity.Interception.Configuration">
            <interceptors>
                <interceptor type="interface">                                
                    <key type="ILogger"/>
                </interceptor>                            
            </interceptors>
        </add>
    </extensionConfig>
    <types>
        <type type="ILogger" mapTo="ConsoleLogger" />
    </types>
</container>

Por fim o construtor da classe Servico deve ser alterado da seguinte forma:

public Servico()
{
    container = new UnityContainer(); 
    section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
    
    section.Containers["InterfaceInterceptionContainer"].Configure(container);            
    
    logger = container.Resolve<ILogger>();
}

Repare que modificamos o código anterior retirando toda a configuração para ser usada em tempo de execução e colocando em seu lugar a linha 6 que diz qual configuração utilizaremos para adicionarmos a extensão de interceptação do Unity. Assim, é possível conferir maior facilidade para alterações nas definições de interceptação, sem a necessidade de recompilar toda a aplicação (a menos, é claro, que você adicione um novo handler).

Até o próximo post da série.

Enterprise Library, Arquitetura , ,



Injeção de Dependência com Unity na .net Magazine edição 62

12/05/2009 23:29

.net Magazine edição 62

Saiu nas bancas essa semana a edição 62 da revista .net Magazine com o meu artigo sobre o padrão de Injeção de Dependência. Nele explico o contexto para utilização desse padrão com o Unity Application Block através de um exemplo prático.

Fiquei muito feliz com a oportunidade de contribuir falando sobre boas práticas e padrões de projeto, e espero que o artigo seja útil para você. A revista traz na capa o tema Azure, LINQ & ADO.NET Data Services, abordado pelo Giovanni Bassi (um dos maiores colaboradores atuais da comunidade brasileira de .NET), além de outros artigos interessantes. Enfim, vale a leitura.

Se você quiser enviar alguma dúvida sobre o artigo, fique a vontade para entrar em contato comigo.

.net Magazine, Artigos , , , ,



EntLib (parte 6) – Interceptação de chamada de interface com o Unity

10/05/2009 23:36

Dentro do desenvolvimento de software chamamos de “cross-cutting concerns” tudo aquilo que faz parte do nosso código provendo funcionalidades comuns entre diversas classes (entre camadas lógicas, por exemplo). Exemplificando, poderíamos dizer que itens como segurança, log, instrumentação de código, são preocupações que atravessam nossas classes, daí dizermos “cross-cutting concerns” ou preocupações transversais.

O Unity Application Block, além de resolver problemas de alto acoplamento também pode ajudar imprimindo um certo nível de AOP (Aspect-oriented programming, ou programação orientada a aspectos) em suas aplicações através de uma extensão da biblioteca chamada InterceptorExtension.

Vamos pegar o mesmo exemplo utilizado no meu post anterior da série, e modifica-lo para vermos como podemos usar uma interceptação para a interface ILogger. Tomaremos o resultado final da classe Servico e faremos a alteração no seu construtor, indicada nas linhas 20 a 28. Basicamente, dizemos ao container que toda vez que o mapeamento da interface ILogger for para a classe concreta ConsoleLogger interceptaremos as chamadas para essa interface (InterfaceInterceptor), aplicando alguma nova característica. Repare que na linha 4 adicionamos o namespace que contém a extensão de interceptação do Unity.

using System.Configuration;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using Microsoft.Practices.Unity.InterceptionExtension;

using Reverb.Loggers;

namespace Reverb.InterceptionSample
{
    public class Servico
    {
        private IUnityContainer container;
        private UnityConfigurationSection section;
        private ILogger logger;

        public Servico()
        {
            container = new UnityContainer();
            
            /* *******************************************
             * Adicionando o tratamento de interceptação
             * para a interface ILogger.
             *********************************************/
            container.AddNewExtension<Interception>();
            container.RegisterType<ILogger, ConsoleLogger>()
                .Configure<Interception>()
                .SetInterceptorFor<ILogger>(new InterfaceInterceptor());
            //*********************************************

            section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            section.Containers.Default.Configure(container);
            logger = container.Resolve<ILogger>();
        }

        public void Iniciar()
        {   
            logger.Log("Iniciando servico...", System.Diagnostics.TraceEventType.Information);

            // Código de inicialização do serviço...

            logger.Log("Servico iniciado.", System.Diagnostics.TraceEventType.Information);
        }

        public void Parar()
        {
            logger.Log("Parando servico...", System.Diagnostics.TraceEventType.Information);

            // Código de parada do serviço...

            logger.Log("Servico Parado.", System.Diagnostics.TraceEventType.Information);
        }
    }
}

Adicionaremos uma nova classe que manipulará a chamada interceptada pelo Unity adicionando um GUID para cada evento, exatamente como o código a seguir:

using System;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.InterceptionExtension;

namespace Reverb.Handlers
{
    public class GUIDAttribute : HandlerAttribute
    {
        public override ICallHandler CreateHandler(IUnityContainer container)
        {
            return new GUIDHandler();
        }
    }

    public class GUIDHandler : ICallHandler
    {
        public int Order { get; set; }

        public IMethodReturn Invoke(
            IMethodInvocation input, 
            GetNextHandlerDelegate getNext)
        {
            System.Guid guid = System.Guid.NewGuid();
            Console.WriteLine();
            Console.WriteLine("ID: {0}", guid.ToString());
            return getNext()(input, getNext);
        }
    }
}

Por fim, decoraremos a interface ILogger com o atributo criado no código anterior:

using System.Diagnostics;
using Reverb.Handlers;

namespace Reverb.Loggers
{
    [GUID]
    public interface ILogger
    {
        void Log(string message, TraceEventType eventType);
    }
}

Desta forma, toda vez que chamarmos a interface ILogger para resolução da classe concreta ConsoleLogger, o Unity interceptará essa chamada utilizando o manipulador GUIDHandler para criar um GUID e adiciona-lo na mensagem de retorno. Como usei um projeto do tipo Console Application o resultado da chamada é ilustrado na imagem abaixo:

ConsoleInterception

Fantástico não?

Enterprise Library, Arquitetura , ,



EntLib (parte 5) – Unity Application Block

09/05/2009 22:53

Aproveitando o embalo do meu post dessa semana sobre o padrão de injeção de dependência, vamos ver o bloco da Enterprise Library responsável por prover essa funcionalidade, chamado Unity Application Block. Criado inicialmente como um projeto separado no CodePlex foi incorporado a Enterprise Library na versão 4.0.

No exemplo de código abaixo a classe Servico utiliza a classe TraceSourceLogger para registrar os passos executados na inicialização e paralização, ou seja, a classe Servico conhece e depende da classe concreta TraceSourceLogger.

public class Servico
{
    private TraceSourceLogger logger;

    public Servico()
    {
        logger = new TraceSourceLogger("Agent");
    }

    public void Iniciar()
    {
        logger.Log("Iniciando serviço...", System.Diagnostics.TraceEventType.Information);

        // Código de inicialização do serviço...

        logger.Log("Serviço iniciado.", System.Diagnostics.TraceEventType.Information);
    }

    public void Parar()
    {
        logger.Log("Parando serviço...", System.Diagnostics.TraceEventType.Information);

        // Código de parada do serviço...

        logger.Log("Serviço parado.", System.Diagnostics.TraceEventType.Information);
    }
}

O problema aqui é que qualquer alteração na forma de realizar o log da operação implicaria em alterações na classe Servico. Por exemplo, se quiséssemos substituir a classe TraceSourceLogger por outra que realizasse a operação gravando no Event Viewer teríamos que realizar a alteração na classe Servico, inclusive recompilando o projeto.

Uma boa prática aqui é fazer com que ao invés de instanciarmos diretamente a classe concreta o fizéssemos através de uma interface, conforme ilustrado no diagrama a seguir:

ClassDiagram1

Em seguida utilizamos o Unity para resolver as chamadas às classes concretas da seguinte forma. Primeiro adicionamos no arquivo de configuração do projeto as configurações abaixo:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
    </configSections>
    <unity>
        <typeAliases>
            <typeAlias
              alias="ILogger"
              type="Reverb.Loggers.ILogger, Reverb.DI" />
            <typeAlias
              alias="ConsoleLogger"
              type="Reverb.Loggers.ConsoleLogger, Reverb.DI" />
            <typeAlias
              alias="TraceSourceLogger"
              type="Reverb.Loggers.TraceSourceLogger, Reverb.DI" />
            <typeAlias
                alias="EventViewerLogger"
                type="Reverb.Loggers.EventViewerLogger, Reverb.DI" />
        </typeAliases>
        <containers>
            <container>
                <types>
                    <type type="ILogger" mapTo="TraceSourceLogger" />
                </types>
            </container>
        </containers>
    </unity>
</configuration>

No arquivo acima indicamos quais os tipos desejados e como o container deve resolver a implementação concreta para a interface ILogger. Depois, alteraríamos a classe Servico conforme exemplo a seguir:

public class Servico
{
    private IUnityContainer container;
    private UnityConfigurationSection section;
    private ILogger logger;

    public Servico()
    {
        container = new UnityContainer();
        section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
        section.Containers.Default.Configure(container);
        logger = container.Resolve<ILogger>();
    }

    public void Iniciar()
    {   
        logger.Log("Iniciando servico...", System.Diagnostics.TraceEventType.Information);

        // Código de inicialização do serviço...

        logger.Log("Servico iniciado.", System.Diagnostics.TraceEventType.Information);
    }

    public void Parar()
    {
        logger.Log("Parando servico...", System.Diagnostics.TraceEventType.Information);

        // Código de parada do serviço...

        logger.Log("Servico Parado.", System.Diagnostics.TraceEventType.Information);
    }
}

Note que no código acima não definimos em momento algum qual seria a implementação da classe concreta que realiza a operação de log, pois isso fica a cargo do container do Unity que resolverá essa dependência de acordo com o que definimos no arquivo de configuração da classe.

Se quiséssemos agora alterar a implementação de classe concreta que resolveria o log bastaria modificar no arquivo de configuração, como no exemplo a seguir:

<containers>
    <container>
        <types>
            <type type="ILogger" mapTo="ConsoleLogger" />
        </types>
    </container>
</containers>

Bem fácil, não? Na revista .net Magazine edição 62 terá um artigo meu sobre Injeção de Dependência com o Unity Application Block, colocarei mais informações aqui na próxima semana, aguardem!

Até o próximo post.

Enterprise Library, Arquitetura , ,