Profil de FabianoFabiano BelmonteBlogListesLivre d'orPlus Outils Aide

Blog


5 août

Delegates

Olá pessoal, em nossas aulas sempre damos dicas para nossos alunos, seja mostrando boas praticas ou novidades ou até mesmo funcionalidades mais antigas, mais que facilitam e deixam o nosso codigo sempre mais inteligente e intuitivo. Eu estava falando sobre delegates, foi na aula em que falava de Querys LINQ utilizando Lambda Expression, e percebi que muitos alunos não conheciam muito sobre delegates e por isso tambem não utilizavam em seus projetos. Por isso resolvi falar um pouco mais sobre o assunto aqui em nosso BLOG.

Os delegates estão presentes no .NET desde sua versão beta. Qual sua função? E permitir que utilizemos metodos de uma outra classe em nosso contexto atual, da mesma maneira que existe os ponteiros para objetos em C++ o delegate pode ser utilizado como referência para uma ou mais funções em C# e ser invocado quando necessário.

Quando criamos um delegate precisamos de um nome e da declaração dos parametros necessários de entrada ou de saida. Os delegates não são construções simples como struct etc, são uma classe, pois qualquer delegate declarado é herdado da classe base System.Delegate do .NET

Na verdade um delegate pode ser herdado de duas classes distintas System.Delegate ou System.MulticastDelegate, se o delegate tiver um tipo de retorno “void” ele é automaticamente um System.MulticastDelegate, assim ele suporta inúmeras funções com um operador “+=”.Se o delegate tiver um tipo de retorno não “void” ele é um System.Delegate e não suporta multiplos métodos como o caso anterior.

Falando em termos menos tecnicos, quando você declara uma variável do tipo do delegate, essa varíavel vai receber (quando for instanciada) um endereço de uma função, que deve ter a mesma assinatura do delegate. É uma especie de ponteiro.

Mãos a obra:

Como Criamos um Delegate:

Podemos criar delegates de duas formas como dito acima, com retorno ou sem retorno. Vejamos:

public delegate int valor(int VL1, int VL2);
e
delegate void PopulaResultado(int Vl1, int Vl2);
Podemos utilizar um exemplo bem simples para demostrar sua utilização.
class Exemplo
{
     static void Main(string[] args)
{
     Exemplo prog = new Exemplo();
     MeuMetodoDelegate MeuEx1 = new MeuMetodoDelegate(prog.ePossitivo);
     MeuMetodoDelegate MeuEx2 = new MeuMetodoDelegate(ePossitivoSimbolo);
     Console.WriteLine("{0} is {1}; use the sign \"{2}\".", 5, MeuEx1(5), MeuEx2(5));
     Console.WriteLine("{0} is {1}; use the sign \"{2}\".", -3, MeuEx1(-3), MeuEx2(-3));
     Console.WriteLine("{0} is {1}; use the sign \"{2}\".", 0, MeuEx1(0), MeuEx2(0));
}
public delegate String MeuMetodoDelegate(int myInt);
public String ePossitivo(int myInt)
{
     if (myInt > 0)
          return ("Sim");
     if (myInt < 0)
          return ("Não");
     return ("Zerado");
}
public static String ePossitivoSimbolo(int myInt)
{
     if (myInt > 0)
          return ("+");
     if (myInt < 0)
          return ("-");
     return ("");
}
}

Observer que criamos um unico delegate MeuMetodoDelegate que recebe um inteiro como parametro e retorna uma String para chamarmos um precisamos da estância da classe e para chamarmos o método statico não precisamos da estância.

Podemos ainda fazer chamadas assíncronas de metedos utilizando o delegate para isso temos que criar o delegate com a mesma assinatura de uma método de fazer a chamada via BeginInvoke. Vejamos um exemplo:

Lembrando que neste caso o método não precisa ser statico

MeuMetodoDelegate MeuEx2 = new MeuMetodoDelegate(this.ePossitivoSimbolo);MeuEx2.BeginInvoke(3, null, null);

Desta maneira você poderá fazer chamadas assíncronas dos seus metodos dentro de sua aplicação, mais um beneficio da utilização de delegates em sua aplicação.

Estes é so um pequeno exemplo de como os delegates podem ser uteis em seu dia a dia.

Bons Códigos...
Fabiano Belmonte

Gerenciando Transações com Trasaction Scope no Asp.Net


Introdução
Neste artigo vou explicar como utilizar o Transaction Scope, que é uma ferramenta que pode ajudar muito no controle de transações de sua aplicação. Também vou mostrar a configuração que deverá ser feita nos servidores para que ele possa funcionar adequadamente, pois muitas pessoas se esquecem deste passo e acabam tendo inúmeros problemas na implemen-tação da funcionalidade em produção ou mesmo no ambiente de teste e desenvolvimento.

O TransactionScope
O .NET Framework 2.0 inclui o namespace System.Transactions que dá um grande suporte a transações distribuídas geren-ciadas pelo Transaction Manager, incluindo Banco de Dados e Serviços de Mensagens(message queues).
O namespace System.Transactions define a classe TransactionScope, que cria e gerencia transações distribuídas.
Devido a sua facilidade de utilização e eficiência, é recomendado que você utilize a classe de TransactionScope para facilitar o controle de transações em sua aplicação, sem que seja necessário (você precise) interagir com a operação propriamente dita.
O TransactionScope pode selecionar e gerenciar o ambiente de Transações automaticamente.
O System.Transactions fornece uma estrutura de transações totalmente integrada ao .NET Framework, mas não se limitando ao ADO.NET.
Utilizando o TransactionScope
O TransactionScope é iniciado quando se cria um novo objeto TransactionScope.
É altamente recomendado que a declaração do scope seja feito dentro da diretiva using, pois ela garante que o objeto dure somente o tempo necessário para sua utilização.
Vamos aos exemplos:
Adicione a referência no projeto ao System.Transaction.

Inclua a referencia na Classe:
image

Incluindo o TransactionScope no Bloco de Codigo:
image 

Completando a transação:
Para “commitar” a transação inserimos uma instrução que será a ultima linha do using.

image

Obs: Caso ocorra algum problema na execução do bloco de código (dentro do using ) automaticamente a transação é abor-tada e o Transaction Maneger executa o Roll Back das alterações.
RollBack:
O RollBack é executado automaticamente quando ocorrer qualquer exceção no bloco que está sendo executado dentro da transação.
Exemplo de utilização:
No cenário abaixo, temos uma transação onde gravamos informações coletadas separadamente (endereço, dados pessoais, etc). Com o Transaction Scope temos a liberdade de gravar as informações separadamente. Suponhamos que estamos gravan-do o cliente e após gravar o Endereço e o Telefone do Cliente da um problema na gravação dos Dados pessoais do mesmo sendo assim o transactionScope faz o Roll Back de tudo! Voltando o objeto ao seu estado original.


image
image

Caso ocorra algum erro durante a gravação de algum desses metodos o TrasactionScope faz o RollBack de tudo, como dito anteriormente. Não havendo nenhum problema a transação é completada normalmente.

A configuração do ambiente
Para que o transactionScope funcione no servidor precisamos fazer algumas configurações, mais somente se o servidor for XP sp2 pra cima! Em Win2000 não precisamos mexer em nada!
Menu Iniciar/Configurações/Painel de Controle/Ferramentas administrativas.
Abra o Serviço de Componentes (como na figura abaixo):

image
Clique com o botão direito do Mouse em Meu Computador(Como na figura Abaixo) e selecione a opção Propriedades.

image
Na janela Clique na aba MSDTC e depois em Configurações de Segurança.

image 

Habilite as opções:
- Acesso ao DTC de Rede. - Permitir Clientes Remotos - Permitir Administração Remota - Permitir Entrada - Permitir Saída - Nenhuma Autenticação Necessária - Permitir Transações do Protocolo TIP - Habilitar Transações XA (como a figura abaixo)

image

Lembrando que essa configuração só deve ser feita em ambientes com sistema operacional Win XP ou Win Server2003. E a mesma deve ser feita tanto no servidor de WEB quanto no de Banco de Dados.
Espero que este artigo contribua com o seu crescimento.

Bons Códigos...
Fabiano Belmonte

1 août

Post Inaugural...

Fala Galera! estou inaugurando hoje o meu Blog!
Ultimamente tenho passado à escrever bastante e resolvi seguir o conselho do meu ilustre e querido amigo Kung-Fu Panda (Vulgo Facunte), amigo este que sempre me incentivou e me ajudou muito em minha caminhada e crescimento profissional! Valeu Pan!  serei sempre grato.
Ainda na seção de agradecimentos não posso deixar de falar de minha querida e amada esposa! Marcela você é sempre uma fonte de inspiração e tranquilidade, sou grato a DEUS todos os dias por ter vc ao meu lado! Obrigado por sua força e incentivo sempre.
Bom sem mais delongas!!! Pretento postar pelo menos uma vez por semana algum artigo, meu objetivo é falar sobre Tecnologias .NET, Arquitetura de Software, sobre Metodologia de Dev e também sobre Padrões de Projetos. Espero que meu número de Post cresça sempre, e que possa sempre contribuir para o seu crescimento, seja ele pessoal ou profissional.
 
 
Bem Vindo!
 
Bons Códigos Sempre...
Fabiano Belmonte