Slides da apresentação sobre DI com o Unity no .Net Architects

02/06/2009 17:34

Segue a apresentação sobre injeção de dependência com Unity que fiz no décimo encontro do .Net Architects.

 

Quem quiser, pode assistir a gravação do encontro que foi transmitido via Live Meeting no link a seguir:

https://www323.livemeeting.com/cc/usergroups/view?id=BH8CBN

Arquitetura, .Net Architects, Palestras , ,



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 , , , ,



.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 , , , ,



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 , ,



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 , ,