foruns de desenvolvimento de software, resolvi demonstrar um exemplo simples e pratico aqui no blog.Observacao: quem nao conhece o termo DDD - Domain Driven Design, aconselho o livro (http://books.google.com.br/books?id=7dlaMs0SECsC&printsec=frontcover&redir_esc=y#v=onepage&q&f=false) do Eric Evans.Imagine a seguinte situacao: sua aplicacao possui uma camada de apresentacao (Windows Forms ou Asp.Net) que utiliza classes que estao localizadas em uma Class Library que faz parte da camada de Dominio (onde residem as entidades, repositorios, fabricas, etc). Uma dessa classes possui propriedades que, dada a ocorrencia de alguns comportamentos, sao alteradas e sua aplicacao precisa ser notificada de tais alteracoes para exibir os resultados ao usuario. Nao seria uma pratica ideal adicionar o namespace System.Windows.Forms na referida classe para utilizar a classe MessageBox, ja que nao deve-se utilizar de tecnologias na camada de Dominio. Injetar referencias para metodos que exibe telas da apresentacao atraves de delegates tambem nao e la das melhores praticas.Entao, qual seria a solucao mais viavel? Eventos e Delegates!O proprio padrao de arquitetura da Dot Net utiliza esses meios. Quando adicionamos um botao em nossa tela ou pagina, por exemplo, o objeto nos oferece varios eventos para utilizarmos ou nao (Click, MouseUp, etc...). Podemos criar nosso proprios eventos para que possamos notificar a aplicacao sobre qualquer alteracao nas propriedades e comportamento do nosso objeto.A traducao do conceito de eventos contido no site do msdn e a seguinte:"Eventos habilitam uma classe ou objeto para notificar outras classes ou objetos quando ocorrer algo de interesse. A classe que envia (ou gera) o evento e chamado de publisher e as classes que recebem (ou lidam com) o evento sao chamados assinantes."Ja o delegate e a referencia (um ponteiro) para um metodo especifico (assim como existem referencias para variaveis) desde que tal metodo tenha a mesma assinatura do delegate.Esses conceitos ficam melhor explicados na pratica, lembrando que o exemplo e apenas para fins didaticos:- Abra o Visual Studio 2010 e crie uma aplicacao WindowsForms (Menu File > New > Project - Aba Windows > WindowsFormsApplication) e de o nome de ExemploEventos;- No formulario padrao que o Visual Studio cria, insira dois buttons e um listbox;- No Button1, altere a propriedade Text para Ligar;- No Button2, altere a propriedade Text para Desligar;- Deixe a aparencia do seu formulario como na figura abaixo:- Na SolutionExplorer, clique com o botao direito do mouse, na opcao Add > Class. De o nome de Carro.- Nossa classe carro ira conter as seguintes propriedades dinamicas: // Indica o total de litros existentes no tanque do carro int LitrosNoTanque { get; set; } // Indica se o carro esta ligado ou desligado bool StatusLigado { get; set; } // Indica se o carro esta em movimento ou parado bool StatusMovimento { get; set; }- A ideia e ter os seguintes comportamentos: ligar, desligar, partir e parar; e para cada alteracao de comportamento do carro criar um evento notificador;-Todo evento tem um TIPO, que geralmente e um delegate para um metodo. Entao, temos que pensar na forma como iremos notificar nosso usuario. Neste exemplo pensei apenas em um metodo simples de notificacao para exibir as mensagens especificas de