Unity 2.0 – Downloads e documentação

10/05/2010 22:20

A Microsoft disponibilizou na última semana os downloads do Unity Application Block 2.0 e sua documentação:


Enjoy it!

Enterprise Library



Lançada a Enterprise Library 5.0

22/04/2010 09:54

DevGuide_PDC_Preview_CSharp_Edition_small

Após 8 dias do lançamento do Visual Studio 2010 a equipe do Patterns & Practices da Microsoft lançou a Enterprise Library 5.0.

No blog do Grigori Melnik você encontra os detalhes da nova versão.

O download da Enterprise Library 5.0 pode ser feito aqui, e uma boa documentação sobre o framework você encontra aqui (imagem ao lado).

Outro recurso interessante que foi disponibilizado é o Microsoft Enterprise Library 5.0 and Unity 2.0 Migration Guide. Por último, é possível utilizar o fórum no CodePlex para tirar as suas dúvidas.

Enterprise Library



Enterprise Library 5.0 está chegando!

05/01/2010 01:21

DevGuide_PDC_Preview_CSharp_Edition_small

O time do patterns & practices responsável pela Enterprise Library está a todo vapor preparando a nova versão. Já é possível baixar um preview do guia Zen and the Art of Managing Crosscutting Concerns in Enterprise Software Development. Outra novidade é que a versão do Unity 2.0 também está a caminho.

No blog do Grigori Melnik tem um vídeo de quase 1 hora com um preview das novidades da Enterprise Library 5.0, vale a pena conferir.

Segundo Melnik a nova versão está levando em consideração os seguintes aspectos:

  • Melhor experiência para o usuário;
  • Fácil de usar;
  • Código com maior consistência;
  • Suporte melhorado para o estilo de desenvolvimento com DI (injeção de dependência);
  • Foco em testabilidade e manutenabilidade.

Particularmente, estou ansioso para ver o que a Enterprise Library 5.0 trará de útil para utilizarmos com o .NET Framework 4.0, já te temos inúmeras novidades a caminho. Vamos aguardar.

Enterprise Library



Décimo quarto encontro do grupo .Net Architects

06/09/2009 16:37

Ontem participei de outro encontro do .Net Architects onde o Luciano Condé (arquiteto de soluções da Microsoft) falou pra nós sobre o Application Architecture Guide, tivemos a oportunidade de discutir sobre arquitetura e experiências vividas pelos presentes na reunião. Gostei muito do encontro, a palestra do Condé foi excelente!

Ele já postou em seu blog o ppt utilizado na apresentação. No ano passado eu havia postado sobre o Application Architecture Guide aqui e aqui, pois como o guia faz parte do patterns & practices da Microsoft vale a pena a leitura (mesmo que só para criticar e dar feedback para a comunidade).

.Net Architects, Enterprise Library ,



Blocos da Enterprise Library que não vingaram…

16/08/2009 22:07

Alguém já usou?

Asynchronous Invocation Application Block


Se sim, por favor, comente aqui.

Enterprise Library



Comparativo entre frameworks de IoC

14/07/2009 23:40

Durante minha palestra sobre Injeção de Dependência com o Unity no DNAD 2009 o Juliano Oliveira comentou sobre um estudo comparativo realizado entre alguns frameworks de DI.

Ele enviou-me o link depois do evento, que compartilho a seguir:

http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html

Valeu Juliano!

Enterprise Library ,



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