<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7988108898550161910</id><updated>2012-02-16T16:58:32.861-08:00</updated><category term='AS3 SVG RENDERER'/><category term='Flash/Flex AS3'/><category term='ASP.NET'/><title type='text'>Lucas Lorentz</title><subtitle type='html'>ASP.NET, Flash, Flex, AS3 e Tecnologia por Lucas Lorentz</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.lucaslorentz.com.br/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default'/><link rel='alternate' type='text/html' href='http://www.lucaslorentz.com.br/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Lucas Lorentz</name><uri>http://www.blogger.com/profile/01725138003009894276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_lkrXmOrrABs/TNbEdGRWbdI/AAAAAAAAACk/v_wEbU9YHPQ/S220/foto.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7988108898550161910.post-1475997890436513900</id><published>2010-11-10T15:31:00.000-08:00</published><updated>2011-02-24T15:17:00.160-08:00</updated><title type='text'>Conceitos de Arquitetura - Injeção de Dependência</title><content type='html'>&lt;div style="text-align: justify;"&gt;Esse é&amp;nbsp;o terceiro artigo de uma série de artigos onde apresentarei alguns conceitos de arquitetura de software utilizados no desenvolvimento de aplicações corporativas.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;Inversão de controle consiste no fluxo ou comportamento do seu código, classe ou aplicativo serem controlados ou modificados externamente. Um exemplo de inversão de controle é a programação orientada a eventos. &lt;br /&gt;
&lt;br /&gt;
Nesse artigo vamos estudar a &lt;strong&gt;Injeção de Dependência&lt;/strong&gt; que também é uma aplicação do conceito de inversão de controle.&lt;br /&gt;
&lt;br /&gt;
A &lt;b&gt;Injeção de Dependência&lt;/b&gt; consiste em retirar da classe a responsabilidade de conhecer ou encontrar as suas dependências, reduzindo o acoplamento, e aumentando a flexibilidade do código. A &lt;b&gt;Injeção de Dependência&lt;/b&gt;&amp;nbsp;na maioria das vezes é realizada&amp;nbsp;utilizando frameworks&amp;nbsp;de inversão de controle.&lt;br /&gt;
&lt;br /&gt;
Mas quando a classe não conhece suas dependências ela deve estar apta a receber essa informação de alguma forma. &lt;br /&gt;
&lt;br /&gt;
Os modos mais comuns de receber essa informação são no construtor, ou em uma propriedade. &lt;br /&gt;
&lt;br /&gt;
Exemplo da classe “Usuario” que permite injeção de dependência por construtor (constructor injection): &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;public class Usuario
{
    private IEnviadorDeEmail _enviadorDeEmail;

    public Usuario(IEnviadorDeEmail enviadorDeEmail)
    {
        this._enviadorDeEmail = enviadorDeEmail;
    }
}
&lt;/pre&gt;&lt;br /&gt;
Exemplo da classe “Usuario” que permite injeção de dependência por propriedade (setter injection): &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;public class Usuario
{
    public IEnviadorDeEmail EnviadorDeEmail { get; set; }
}
&lt;/pre&gt;&lt;br /&gt;
Um framework muito famoso que auxilia a realizar Inversão de Controle e Injeção de Dependência é o Spring.NET (http://www.springframework.net/), que é baseado nos conceitos já consolidados do Spring (versão para Java). &lt;br /&gt;
&lt;br /&gt;
Todo o funcionamento do Spring baseia-se na configuração dos objetos que são utilizados na nossa aplicação, geralmente essa configuração é feita em formato XML. &lt;br /&gt;
&lt;br /&gt;
Exemplo de configuração de um objeto básico no Spring.NET: &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;object id="EnviadorDeEmailPadrao" type="Namespace.EnviadorDeEmailPorSMTP, AssemblyName" singleton="true" /&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Todo objeto configurado no Spring.NET que deve ser exposto para a aplicação deve possuir o atributo “id”, que é o nome que você utilizará para identificar aquele objeto. Também definimos o atributo “type”, que é o nome completo (com assembly) do tipo que será utilizado na criação do objeto quando ele for requisitado. O atributo “singleton” define que o objeto pode ser reutilizado, ou seja, apenas 1 objeto será criado, e o mesmo objeto será retornado sempre que solicitado ao Spring.NET. &lt;br /&gt;
&lt;br /&gt;
Quando precisamos enviar um e-mail na nossa aplicação, basta solicitarmos ao Spring o objeto pelo id, por exemplo: &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;//Obtemos o contexto atual da aplicação no spring
IApplicationContext ctx = ContextRegistry.GetContext();

//Solicitamos ao contexto do spring o objeto com id EnviadorDeEmail
IEnviadorDeEmail enviadorDeEmail = (IEnviadorDeEmail) ctx.getObject("EnviadorDeEmailPadrao");
&lt;/pre&gt;&lt;br /&gt;
Agora, veja como ficaria a configuração do Spring realizando injeção de dependência na classe “Usuario” por construtor: &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;object id="EnviadorDeEmailPadrao" type="Namespace.EnviadorDeEmailPorSMTP, AssemblyName" singleton="true" /&amp;gt;

&amp;lt;object id="Usuario" type="MeuNamespaceDeNegocio.Usuario, NomeDoAssemblyDeNegocio" singleton="false"&amp;gt;
    &amp;lt;constructor-arg name="enviadorDeEmail" ref="EnviadorDeEmailPadrao" /&amp;gt;
&amp;lt;/object&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
E também por propriedade: &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;object id="EnviadorDeEmailPadrao" type="Namespace.EnviadorDeEmailPorSMTP, AssemblyName" singleton="true" /&amp;gt;

&amp;lt;object id="Usuario" type="MeuNamespaceDeNegocio.Usuario, NomeDoAssemblyDeNegocio" singleton="false"&amp;gt;
    &amp;lt;property name="EnviadorDeEmail" ref="EnviadorDeEmailPadrao" /&amp;gt;
&amp;lt;/object&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Nesses exemplos, configuramos um objeto com id “EnviadorDeEmailPadrao”, que é responsável pelo envio de e-mail, e também configuramos o objeto “Usuario”, que é nossa classe de negócio da entidade Usuário. Mas ao configurar o objeto “Usuario”, através dos nós “constructor-arg” ou “property”, definimos que o objeto “EnviadorDeEmailPadrao” deve ser passado ao objeto “Usuario” no construtor, ou através da propriedade. Realizando assim, a injeção de dependência. &lt;br /&gt;
&lt;br /&gt;
Agora, sempre que precisarmos instanciar um objeto da classe “Usuario”, pedimos ao Spring o objeto, conforme o código abaixo: &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;//Solicitamos ao contexto do spring o objeto com id Usuario
Usuario usuario = (Usuario) ContextRegistry.GetContext().getObject("Usuario");
&lt;/pre&gt;&lt;br /&gt;
E o objeto retornado já estará com as suas dependências preenchidas. &lt;br /&gt;
&lt;br /&gt;
Embora o exemplo não tenha utilizado, é recomendável a criação de uma classe para encapsular a obtenção dos objetos do contexto do Spring.NET, desse modo, estaremos acoplando apenas uma classe do nosso projeto ao Spring, o que tornará mais fácil a migração para outro framework de injeção de dependência. &lt;br /&gt;
&lt;br /&gt;
Quando precisarmos alterar nosso sistema para enviar e-mail utilizando SQL Server, podemos alterar a configuração do Spring para algo semelhante a: &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;object id="EnviadorDeEmailPadrao" type="Namespace.EnviadorDeEmailPorSQLServer, AssemblyName" singleton="true" /&amp;gt;

&amp;lt;object id="Usuario" type="MeuNamespaceDeNegocio.Usuario, NomeDoAssemblyDeNegocio" singleton="false"&amp;gt;
    &amp;lt;property name="EnviadorDeEmail" ref="EnviadorDeEmailPadrao" /&amp;gt;
&amp;lt;/object&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Ou imagine que você queira parametrizar a classe “EnviadorDeEmailPorSMTP”, com as propriedades “Servidor”, “Porta”, “Usuario” e “Senha”. Após criarmos as propriedades, podemos alterar a configuração do Spring para: &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;object id="EnviadorDeEmailPadrao" type="Namespace.EnviadorDeEmailPorSQLServer, AssemblyName" singleton="true"&amp;gt;
    &amp;lt;property name="Servidor" value="192.168.0.10" /&amp;gt;
    &amp;lt;property name="Porta" value="25" /&amp;gt;
    &amp;lt;property name="Usuario" value="aplicacao1" /&amp;gt;
    &amp;lt;property name="Senha" value="123456" /&amp;gt;
&amp;lt;/object&amp;gt;

&amp;lt;object id="Usuario" type="MeuNamespaceDeNegocio.Usuario, NomeDoAssemblyDeNegocio" singleton="false"&amp;gt;
    &amp;lt;property name="EnviadorDeEmail" ref="EnviadorDeEmailPadrao" /&amp;gt;
&amp;lt;/object&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Isso é apenas o início das possibilidades do Spring.NET, mas essas simples funcionalidades podem ajudar enormemente na configuração da aplicação e no desacoplamento.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7988108898550161910-1475997890436513900?l=www.lucaslorentz.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lucaslorentz.com.br/feeds/1475997890436513900/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.lucaslorentz.com.br/2010/11/conceitos-de-arquitetura-injecao-de.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/1475997890436513900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/1475997890436513900'/><link rel='alternate' type='text/html' href='http://www.lucaslorentz.com.br/2010/11/conceitos-de-arquitetura-injecao-de.html' title='Conceitos de Arquitetura - Injeção de Dependência'/><author><name>Lucas Lorentz</name><uri>http://www.blogger.com/profile/01725138003009894276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_lkrXmOrrABs/TNbEdGRWbdI/AAAAAAAAACk/v_wEbU9YHPQ/S220/foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7988108898550161910.post-104604814697566572</id><published>2010-11-10T15:30:00.001-08:00</published><updated>2010-11-10T15:30:46.890-08:00</updated><title type='text'>Conceitos de Arquitetura – Desacoplamento por Interfaces</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;Esse é&amp;nbsp;o segundo artigo de uma série de artigos onde apresentarei alguns conceitos de arquitetura de software utilizados no desenvolvimento de aplicações corporativas.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;O desacoplamento é extremamente importante para aumentar a flexibilidade ao configurar/desenvolver uma aplicação. E isso trás muitos benefícios no futuro, uma vez que o mercado está em constante evolução e a todo o momento os usuários dos sistemas precisam de novas adequações neles.&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Uma prática para aumentar o desacoplamento, é a programação com interfaces. Em programação orientada a objetos, interface é um contrato que define o que a classe deve fazer, mas não como fazer. Para aumentar o desacoplamento, quando há dependência entre classes, referenciamos as interfaces da nossa dependência, ao invés de referenciar a classe diretamente.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Outra prática muito importante para aumentar desacoplamento é separar responsabilidades diferentes em classes diferentes. Ou seja, cada classe deve ter apenas uma responsabilidade.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Veja abaixo um exemplo que possui uma classe que realiza o envio de e-mail utilizando um servidor SMTP, e uma classe de negócio que precisa enviar e-mail.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;pre class="brush:csharp"&gt;public class EnviadorDeEmailPorSMTP {
  …
  public void EnviarEmail(string[] destinatarios, string assunto, string corpo){
    …
    //Realiza o envio de e-mail
    …
  }
}
public class Usuario {
  …
  public void RecuperarSenha(EnviadorDeEmailPorSMTP enviadorDeEmail){
    …
    enviadorDeEmail.EnviarEmail(this.Email, assunto, corpo);
  }
}
&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Realizando o desacoplamento através da utilização de interfaces temos.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;pre class="brush:csharp"&gt;public interface IEnviadorDeEmail {
  void EnviarEmail(string[] destinatarios, string assunto, string corpo);
}
public class EnviadorDeEmailPorSMTP : IEnviadorDeEmail {
  …
  public void EnviarEmail(string[] destinatarios, string assunto, string corpo){
    …
    //Realiza o envio de e-mail
    …
  }
}
public class Usuario {
  …
  public void RecuperarSenha(IEnviadorDeEmail enviadorDeEmail){
    …
    enviadorDeEmail.EnviarEmail(this.Email, assunto, corpo);
  }
}
&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Desenvolvendo dessa forma, a classe “Usuario” não está acoplada a uma determinada forma de envio de e-mail.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Se quisermos criar uma classe chamada “EnviadorDeEmailPorSQLServer”, que realiza o envio de e-mail utilizando um servidor de banco de dados SQL Server. Basta que a nova classe implemente a interface “IEnviadorDeEmail”, e ela poderá ser utilizada para envio de e-mail pela classe “Usuario”. Nesse caso, é perceptível que as duas classes de envio de e-mail fazem a mesma coisa, porém de forma diferente.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Em certas circunstâncias não é interessante realizar o envio de e-mail, como ao testarmos o comportamento da classe “Usuario”. Neste caso, poderíamos também ter uma classe chamada “FalsoEnviadorDeEmail”, que implementa a interface “IEnviadorDeEmail” mas não realiza o envio do e-mail.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Utilizei tal exemplo por que fica clara a possibilidade das duas formas de envio de e-mail, e ainda é perceptível a necessidade de não enviar e-mail durante os testes, sem precisar entrar no mérito de testes de unidade. Mas mesmo assim não gosto do envio de e-mail utilizando SQL Server, então, se você souber de um exemplo legal, favor me informar.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7988108898550161910-104604814697566572?l=www.lucaslorentz.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lucaslorentz.com.br/feeds/104604814697566572/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.lucaslorentz.com.br/2010/11/conceitos-de-arquitetura-desacoplamento.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/104604814697566572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/104604814697566572'/><link rel='alternate' type='text/html' href='http://www.lucaslorentz.com.br/2010/11/conceitos-de-arquitetura-desacoplamento.html' title='Conceitos de Arquitetura – Desacoplamento por Interfaces'/><author><name>Lucas Lorentz</name><uri>http://www.blogger.com/profile/01725138003009894276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_lkrXmOrrABs/TNbEdGRWbdI/AAAAAAAAACk/v_wEbU9YHPQ/S220/foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7988108898550161910.post-3031235214541268581</id><published>2010-11-10T15:30:00.000-08:00</published><updated>2010-11-10T15:30:01.163-08:00</updated><title type='text'>Conceitos de Arquitetura – Camadas</title><content type='html'>&lt;div style="text-align: justify;"&gt;Essa é a introdução de uma série de artigos onde apresentarei alguns conceitos de arquitetura de software utilizados no desenvolvimento de aplicações corporativas.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;Para um melhor aproveitamento do conteúdo dos artigos, são recomendáveis conhecimentos prévios de:&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Programação Orientada a Objetos&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Linguagem de programação C#&lt;/li&gt;
&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O objetivo realmente é apenas apresentar os conceitos, recomendo que leia outros materiais para o aprofundamento no assunto.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;&lt;strong&gt;&lt;span style="font-weight: normal;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;Camadas&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O princípio de camadas é um conceito básico de arquitetura de software, muitos desenvolvedores estão familiarizados com ele.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Tal princípio consiste em distribuir a aplicação em camadas, com responsabilidades e dependências bem definidas.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mas por que devemos utilizar camadas no software?&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ao utilizar camadas no software, obtemos uma melhor organização, reduzimos o acoplamento, permitimos o reuso dos componentes e aumentamos a manutenibilidade.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Vamos a um exemplo simples.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Imagine uma aplicação de cadastro de clientes de uma loja, em que uma única classe, é responsável por representar a entidade “Cliente”, apresentar as informações em um formulário Windows e também persistir suas informações em banco de dados.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Agora, surge a necessidade de criar uma aplicação Web para exibir as informações dos clientes.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Como vamos reutilizar o código responsável por representar a entidade “Cliente” e persistir as informações no banco de dados, se estes estão atrelados ao código que apresenta as informações em um formulário Windows?&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Se aplicação estivesse dividida em camadas como:&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Apresentação Windows – Responsável por exibir as informações do cliente em formulários Windows.&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Negócio – Responsável por representar a entidade cliente, bem como possuir suas regras de negócio.&lt;/li&gt;
&lt;li style="text-align: justify;"&gt;Persistência – Responsável por persistir e obter a entidade cliente do banco de dados.&lt;/li&gt;
&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
Poderíamos reutilizar as camadas “Negócio” e “Persistência”, a criar uma camada de apresentação para Web.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ao dividir a aplicação em camadas, também devemos definir claramente as dependências entre as camadas. Nesse caso, a camada “Apresentação Web” depende da camada “Negócio”, que por sua vez, depende da camada “Persistência”.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7988108898550161910-3031235214541268581?l=www.lucaslorentz.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lucaslorentz.com.br/feeds/3031235214541268581/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.lucaslorentz.com.br/2010/11/conceitos-de-arquitetura-camadas.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/3031235214541268581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/3031235214541268581'/><link rel='alternate' type='text/html' href='http://www.lucaslorentz.com.br/2010/11/conceitos-de-arquitetura-camadas.html' title='Conceitos de Arquitetura – Camadas'/><author><name>Lucas Lorentz</name><uri>http://www.blogger.com/profile/01725138003009894276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_lkrXmOrrABs/TNbEdGRWbdI/AAAAAAAAACk/v_wEbU9YHPQ/S220/foto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7988108898550161910.post-3764003365224563656</id><published>2009-11-29T16:03:00.000-08:00</published><updated>2011-02-01T03:27:25.234-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash/Flex AS3'/><title type='text'>Loading True Type fonts in Flash/Flex at runtime</title><content type='html'>UPDATE 06/01/2010&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;It doesn't use Tamarin ESC Compiler anymore.&lt;/li&gt;
&lt;li&gt;You can download the source code &lt;a href="http://www.mjlconstrutora.com.br/Blog/FontConverter.zip"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;-------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Currently there are two usual ways to use embedded fonts in Flash/Flex: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Embed the font in the application SWF.&lt;/li&gt;
&lt;li&gt;Or generate SWF files with the fonts, and then load them at runtime.&lt;/li&gt;
&lt;/ul&gt;But with some tricks, it's also possible to load True Type fonts in a Flash/Flex application at runtime.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.mjlconstrutora.com.br/blog/FontLoader/FontTest.html" target="_blank"&gt;Click here&lt;/a&gt; to open an experiment I've made that does that.&lt;br /&gt;
&lt;br /&gt;
What are the advantages? &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;It's easy to use and share fonts between Flash/Flex applications.&lt;/li&gt;
&lt;li&gt;RIAs like text processors, image editors and others, can use this technique to allow users to use their own fonts.&lt;/li&gt;
&lt;/ul&gt;How it was done? &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;The font file (.ttf) is loaded and parsed.&lt;/li&gt;
&lt;li&gt;The glyphs are converted and a SWF file is generated in memory.&lt;/li&gt;
&lt;li&gt;Using the class flash.display.Loader, the in-memory SWF is loaded, and the font is registered.&lt;/li&gt;
&lt;/ol&gt;What I've used? &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;swfassist - A great work! It is a AS3 library to read and write SWF files. &lt;a href="http://www.libspark.org/wiki/yossy/swfassist"&gt;http://www.libspark.org/wiki/yossy/swfassist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tamarin ESC Compiler - Is a ES4 compiler written in ES4. The output is bytecodes to Tamarin VM (Flash Player 9 or higher). &lt;a href="http://www.mozilla.org/projects/tamarin/"&gt;http://www.mozilla.org/projects/tamarin/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FontReader - Library to read True Type Font files. It's an AS3 port of the java project TypeCast, made by Alessandro Crugnola. &lt;a href="http://www.sephiroth.it/weblog/archives/2007/07/fontreader_convert_truetype_fonts_in.php"&gt;http://www.sephiroth.it/weblog/archives/2007/07/fontreader_convert_truetype_fonts_in.php&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: x-large;"&gt;Em português:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Atualmente, há duas maneiras usuais de utilizar fontes embutidas em uma aplicação Flash/Flex:  &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Gerar o SWF da aplicação com a fonte embutida.&lt;/li&gt;
&lt;li&gt;Gerar arquivos SWF para as fontes, e carregá-los dinamicamente na aplicação.&lt;/li&gt;
&lt;/ul&gt;Mas com alguns truques, também é possível carregar fontes True Type no Flash/Flex em tempo de execução.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.mjlconstrutora.com.br/blog/FontLoader/FontTest.html" target="_blank"&gt;Clique aqui&lt;/a&gt; para abrir um experimento que desenvolvi que faz isso.&lt;br /&gt;
&lt;br /&gt;
Quais as vantagens? &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Maior facilidade na utilização de fontes compartilhadas em aplicações Flash/Flex.&lt;/li&gt;
&lt;li&gt;RIAs como processadores de texto, editores de imagens e outros, poderão utilizar o carregamento de fontes True Type para permitir aos usuários a utilização de suas próprias fontes.&lt;/li&gt;
&lt;/ul&gt;Como isso é feito? &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;O arquivo da fonte (.ttf) é carregado e interpretado.&lt;/li&gt;
&lt;li&gt;Os caracteres da fonte são convertidos e um arquivo SWF é gerado na memória.&lt;/li&gt;
&lt;li&gt;Utilizando a classe flash.display.Loader é feito o carregamento desse SWF, e a fonte é registrada.&lt;/li&gt;
&lt;/ol&gt;O que utilizei? &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;swfassist - Um grande trabalho! É uma biblioteca em AS3 para leitura e escrita de arquivos SWF. &lt;a href="http://www.libspark.org/wiki/yossy/swfassist"&gt;http://www.libspark.org/wiki/yossy/swfassist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tamarin ESC Compiler - Compilador de ES4 escrito em ES4. Gera bytecodes para a máquina virtual Tamarin (Flash Player 9 ou superior). &lt;a href="http://www.mozilla.org/projects/tamarin/"&gt;http://www.mozilla.org/projects/tamarin/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FontReader - Biblioteca AS3 para a leitura de fontes True Type. Foi portada a partir do projeto em java TypeCast por Alessandro Crugnola. &lt;a href="http://www.sephiroth.it/weblog/archives/2007/07/fontreader_convert_truetype_fonts_in.php"&gt;http://www.sephiroth.it/weblog/archives/2007/07/fontreader_convert_truetype_fonts_in.php&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7988108898550161910-3764003365224563656?l=www.lucaslorentz.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lucaslorentz.com.br/feeds/3764003365224563656/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.lucaslorentz.com.br/2009/11/loading-true-type-fonts-in-flash-at.html#comment-form' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/3764003365224563656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/3764003365224563656'/><link rel='alternate' type='text/html' href='http://www.lucaslorentz.com.br/2009/11/loading-true-type-fonts-in-flash-at.html' title='Loading True Type fonts in Flash/Flex at runtime'/><author><name>Lucas Lorentz</name><uri>http://www.blogger.com/profile/01725138003009894276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_lkrXmOrrABs/TNbEdGRWbdI/AAAAAAAAACk/v_wEbU9YHPQ/S220/foto.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7988108898550161910.post-6558330542563005110</id><published>2009-07-24T21:18:00.000-07:00</published><updated>2010-11-19T17:06:55.340-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET - Gráfico de Gantt</title><content type='html'>Há alguns dias atrás, eu e um colega de trabalho decidimos colocar um Gráfico de Gantt em um projeto. &lt;br /&gt;
&lt;br /&gt;
Queríamos algo parecido com o gráfico do Microsoft Project. &lt;br /&gt;
&lt;br /&gt;
Como não achei soluções gratuitas na web que me agradassem, iniciei o desenvolvimento de um componente de Gráfico de GANTT em ASP.NET. &lt;br /&gt;
&lt;br /&gt;
Bom, estou disponibilizando o código desse componente. Escrevi o código todo em português, então é um bom material para estudo. &lt;br /&gt;
&lt;br /&gt;
Está bem enxuto, adicionei apenas os recursos que eu acho úteis para exibição do relatório. É interessante adicionar outras funcionalidades, como eventos e estilos na tabela, mas não o farei por enquanto. &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/_lkrXmOrrABs/SmqIS6d_ymI/AAAAAAAAABM/x8NiMkrWT0w/s1600-h/GraficoGantt.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5362248164852091490" src="http://3.bp.blogspot.com/_lkrXmOrrABs/SmqIS6d_ymI/AAAAAAAAABM/x8NiMkrWT0w/s400/GraficoGantt.png" style="cursor: hand; cursor: pointer; height: 277px; width: 400px;" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
Faça download &lt;a href="http://www.mjlconstrutora.com.br/Blog/ExemploGraficoGantt.zip"&gt;aqui &lt;/a&gt; do projeto de exemplo com o código do componente. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Para inserir o componente em uma página:&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
Coloque as classes dentro da pasta App_Code. &lt;br /&gt;
&lt;br /&gt;
Registre o namespace no topo do arquivo .aspx. &lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;%@ Register Namespace="CustomControls" TagPrefix="cc" %&amp;gt;&lt;/pre&gt;Insira o componente manualmente. &lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;cc:GraficoGantt runat="server" ID="GraficoGantt1"&amp;gt;&amp;lt;/cc:GraficoGantt&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7988108898550161910-6558330542563005110?l=www.lucaslorentz.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lucaslorentz.com.br/feeds/6558330542563005110/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.lucaslorentz.com.br/2009/07/ha-alguns-dias-atras-eu-e-um-colega-de.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/6558330542563005110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/6558330542563005110'/><link rel='alternate' type='text/html' href='http://www.lucaslorentz.com.br/2009/07/ha-alguns-dias-atras-eu-e-um-colega-de.html' title='ASP.NET - Gráfico de Gantt'/><author><name>Lucas Lorentz</name><uri>http://www.blogger.com/profile/01725138003009894276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_lkrXmOrrABs/TNbEdGRWbdI/AAAAAAAAACk/v_wEbU9YHPQ/S220/foto.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_lkrXmOrrABs/SmqIS6d_ymI/AAAAAAAAABM/x8NiMkrWT0w/s72-c/GraficoGantt.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7988108898550161910.post-5331599368985459413</id><published>2009-07-18T14:11:00.000-07:00</published><updated>2009-07-19T08:11:46.205-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET - MessageBox</title><content type='html'>Quem já desenvolveu para Windows Forms com .NET, provavelmente já utilizou a classe MessageBox para exibir mensagens de diálogo ao usuário. Ex:
&lt;pre class="brush:csharp"&gt;MessageBox.Show("Ocorreu um erro catastrófico, o programa será fechado.");&lt;/pre&gt;
Porém, o conceito da plataforma ASP.NET é totalmente diferente, e nela essa classe não existe.
&lt;br&gt;&lt;br&gt;Então como exibir mensagens para o usuário no ASP.NET?
&lt;br&gt;&lt;br&gt;
Por algum tempo utilizei:
&lt;pre class="brush:csharp"&gt;ScriptManager.RegisterClientScriptBlock(Page, GetType(), "mensagem", "alert('Ocorreu um erro catastrófico durante a excluso do item.')", true);&lt;/pre&gt;
Que nada mais é do que registrar um bloco de javascript na página, e nesse bloco chamamos a função alert passando a mensagem desejada como parâmetro.
&lt;br&gt;&lt;br&gt;
A procura de uma solução que me agradasse mais, resolvi pesquisar por algo semelhante à classe MessageBox para ASP.NET, e encontrei algumas implementações que recebem a mensagem a ser exibida e adicionam na página os códigos necessários.
&lt;br&gt;&lt;br&gt;
Ex de utilização:
&lt;pre class="brush:csharp"&gt;MessageBox.show("MENSAGEM");&lt;/pre&gt;
&lt;br&gt;&lt;a href="http://www.mjlconstrutora.com.br/Blog/MessageBoxAlert.zip"&gt;Aqui&lt;/a&gt; está a classe MessageBox que exibe mensagens utilizando a função alert. Para utilizar coloque o arquivo MessageBox.cs dentro da pasta App_Code.
&lt;br&gt;&lt;br&gt;
Entretanto, a janela exibida pela função alert é de responsabilidade do browser, pode ter diversas formas e cores, geralmente são irritantes e não combinam com a identidade visual do sistema.
&lt;br&gt;&lt;br&gt;
&lt;a href="http://4.bp.blogspot.com/_lkrXmOrrABs/SmJCTqkNXyI/AAAAAAAAAAs/TJEMyEVW7jA/s1600-h/alertOpera.png"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 400px; HEIGHT: 159px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5359919412135419682" border="0" alt="" src="http://4.bp.blogspot.com/_lkrXmOrrABs/SmJCTqkNXyI/AAAAAAAAAAs/TJEMyEVW7jA/s400/alertOpera.png" /&gt;&lt;/a&gt;
&lt;span style="font-size:85%;"&gt;Janela de alerta do Opera 9.51&lt;/span&gt;
&lt;br&gt;&lt;br&gt;
Resolvi então modificar a classe MessageBox para exibir mensagens sem a função alert.
&lt;br&gt;Integrei a classe ao Framework ExtJS, adicionei também suporte aos ícones que eu desejava nas mensagens, e vejam que resultado legal:
&lt;br&gt;&lt;br&gt;
&lt;a href="http://3.bp.blogspot.com/_lkrXmOrrABs/SmJLnO6Ch1I/AAAAAAAAAA0/6nIG9SYV7eI/s1600-h/messageBoxExtJS.png"&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_lkrXmOrrABs/SmKAu-ZOZNI/AAAAAAAAAA8/DM5mMrkHFAU/s1600-h/MessageBoxExtJS.png"&gt;&lt;img style="WIDTH: 313px; HEIGHT: 126px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5359988051035448530" border="0" alt="" src="http://2.bp.blogspot.com/_lkrXmOrrABs/SmKAu-ZOZNI/AAAAAAAAAA8/DM5mMrkHFAU/s400/MessageBoxExtJS.png" /&gt;&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
Modos de utilização:
&lt;pre class="brush:csharp"&gt;
MessageBox.Show("Mensagem1", MessageBox.MessageType.Success);
MessageBox.Show("Mensagem2", MessageBox.MessageType.Warning);
MessageBox.Show("Mensagem3", MessageBox.MessageType.Info);
MessageBox.Show("Mensagem4", MessageBox.MessageType.Error);
&lt;/pre&gt;
Baixe &lt;a href="http://www.mjlconstrutora.com.br/Blog/ExemploMessageBoxExtJS.zip"&gt;aqui&lt;/a&gt; um projeto de exemplo, com a classe MessageBox e os arquivos do ExtJS necessários.
&lt;br&gt;&lt;br&gt;Manter a exibição de mensagens encapsulada na classe MessageBox simplifica o código e permite alterar facilmente o modo como todas as mensagens do projeto aparecem.
&lt;br&gt;&lt;br&gt;Agora é só modificar para atender melhor às suas necessidades.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7988108898550161910-5331599368985459413?l=www.lucaslorentz.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lucaslorentz.com.br/feeds/5331599368985459413/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.lucaslorentz.com.br/2009/07/aspnet-messagebox.html#comment-form' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/5331599368985459413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/5331599368985459413'/><link rel='alternate' type='text/html' href='http://www.lucaslorentz.com.br/2009/07/aspnet-messagebox.html' title='ASP.NET - MessageBox'/><author><name>Lucas Lorentz</name><uri>http://www.blogger.com/profile/01725138003009894276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_lkrXmOrrABs/TNbEdGRWbdI/AAAAAAAAACk/v_wEbU9YHPQ/S220/foto.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_lkrXmOrrABs/SmJCTqkNXyI/AAAAAAAAAAs/TJEMyEVW7jA/s72-c/alertOpera.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7988108898550161910.post-2131830809313863339</id><published>2009-07-16T20:31:00.000-07:00</published><updated>2010-11-19T07:03:36.153-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET - Controle DList</title><content type='html'>EDITADO EM 03/03/2010&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Correção de falhas&lt;/li&gt;
&lt;li&gt;Adicionado suporte a vários tipos de itens, cada um com um template próprio.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Sei que não tem muitas informações sobre a utilização do componente, mas quem quiser saber mais basta perguntar.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;EDITADO em 03/08/2009 &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;O código do componente está mais organizado.&lt;/li&gt;
&lt;li&gt;Adicionado o LayoutTemplate.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Constantemente tenho necessidade de criar uma interfance com uma lista de cadastro dinâmica, conforme a imagem abaixo. Onde o número de alternativas pode variar de 1 até N.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://4.bp.blogspot.com/_lkrXmOrrABs/Sl__8PuuTOI/AAAAAAAAAAk/li5K9FIKNY0/s1600-h/DListExemplo.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5359283492073917666" src="http://4.bp.blogspot.com/_lkrXmOrrABs/Sl__8PuuTOI/AAAAAAAAAAk/li5K9FIKNY0/s400/DListExemplo.png" style="cursor: hand; height: 181px; width: 400px;" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
Resolvi então criar um Custom Control, que chamei de DList (Dynamic List), uma espécie de DataList sem DataSource. &lt;br /&gt;
&lt;br /&gt;
Então vamos colocar a mão na massa e criar interfaces utilizando o componente. &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Abra o Visual Studio 2008, e crie um novo Website, utilizando a linguagem C#.&lt;/li&gt;
&lt;li&gt;Faça download de um projeto de exemplo com as classes do componente DList &lt;a href="http://www.mjlconstrutora.com.br/Blog/ExemploDList3.zip"&gt;aqui&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Copie a pasta DList de dentro da pasta App_Code do projeto de exemplo para a pasta App_Code do seu projeto.&lt;/li&gt;
&lt;li&gt;Adicionamos então uma referência para uma dll utilizada pelas classes, clique com o botão direito sobre a solução, em seguida clique em "Add reference", localize o item "System.Design" e clique em "Ok".&lt;/li&gt;
&lt;/ol&gt;Pronto, agora podemos utilizar o controle DList.&lt;br /&gt;
Para utilizá-lo em alguma página, registre o namespace adicionado a seguinte linha no início do arquivo .aspx &lt;br /&gt;
&lt;pre&gt;&amp;lt;@ Register Namespace="CustomControls" TagPrefix="cc" %&amp;gt;&lt;/pre&gt;Adicione o controle na página com a seguinte linha: &lt;br /&gt;
&lt;pre&gt;&amp;lt;cc:DList runat="server" ID="DList1" /&amp;gt;&lt;/pre&gt;O componente suporta 3 templates:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;LayoutTemplate&lt;/strong&gt;, utilizado para layout do componente, coloque um PlaceHolder para determinar o local onde os itens serão adicionados;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ItemTemplate&lt;/strong&gt;, utilizado para a criação de cada item;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SeparatorTemplate&lt;/strong&gt;, adicionado entre os itens.&lt;/li&gt;
&lt;/ul&gt;O componente possui 3 eventos: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;ItemIndexChange&lt;/strong&gt;, disparado sempre que há alteração na posição de um elemento, facilitando a atualização de numeradores.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ItemCreate&lt;/strong&gt;, disparado sempre que um item é criado, permitindo adição de componentes dinamicamente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ItemCommand&lt;/strong&gt;, disparado sempre que um comando "borbulha" de algum componente interno.&lt;/li&gt;
&lt;/ul&gt;A classe DListItem, possui uma propriedade chamada ViewStateData, que pode ser utilizada para armazenar informações no viewState do item, evitando o uso de hidden fields dentro do template.&lt;br /&gt;
Atualmente o controle atende às minhas necessidades, caso eu adicione novas funcionalidades ou faça modificações, postarei o código atualizado.&lt;br /&gt;
Estou a disposição para dúvidas, sugestões, pedidos, ou discutir abordagens para essa situação.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7988108898550161910-2131830809313863339?l=www.lucaslorentz.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lucaslorentz.com.br/feeds/2131830809313863339/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.lucaslorentz.com.br/2009/07/aspnet-controle-dlist.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/2131830809313863339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/2131830809313863339'/><link rel='alternate' type='text/html' href='http://www.lucaslorentz.com.br/2009/07/aspnet-controle-dlist.html' title='ASP.NET - Controle DList'/><author><name>Lucas Lorentz</name><uri>http://www.blogger.com/profile/01725138003009894276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_lkrXmOrrABs/TNbEdGRWbdI/AAAAAAAAACk/v_wEbU9YHPQ/S220/foto.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_lkrXmOrrABs/Sl__8PuuTOI/AAAAAAAAAAk/li5K9FIKNY0/s72-c/DListExemplo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7988108898550161910.post-3656450212979015741</id><published>2009-07-16T13:29:00.000-07:00</published><updated>2009-07-18T20:33:30.071-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AS3 SVG RENDERER'/><title type='text'>AS3 SVG Renderer</title><content type='html'>&lt;div&gt;Primeiramente, gostaria de dizer que não tenho experiência com blogs, então me perdoem pela falta de jeito. Espero que aos poucos eu vá me acostumando.
&lt;br&gt;&lt;br&gt;
Estou criando esse blog para difundir conhecimentos e idéias a respeito de tecnologia, principalmente ASP.NET, Flash, Flex, AS3, bem como divulgar alguns projetos.
&lt;br&gt;&lt;br&gt;
Aproveitando o primeiro post, vou falar a respeito de um projeto open-source que mantenho: AS3 SVG Renderer. Uma bilbioteca para renderização de SVG (Scalable Vectorial Graphics) em tempo real em AS3, que pode ser utilizada no Flash ou Flex.
&lt;br&gt;&lt;br&gt;
O projeto está hospedado no google code: &lt;a href="http://code.google.com/p/as3svgrendererlib/"&gt;http://code.google.com/p/as3svgrendererlib/&lt;/a&gt;
&lt;br&gt;&lt;br&gt;
Comecei a me envolver com a renderização de SVG para utilização em um projeto, com mapas da Universidade Vale do Rio Doce. Ao buscar soluções que permitissem exibir SVG no Flash dinamicamente, me deparei com a biblioteca AS3 SVG Renderer, inicialmente desenvolvida por Charles Dietrich.
&lt;br&gt;&lt;br&gt;
Embora ainda estivesse em um estado inicial, a bilbioteca não estava sendo continuada, devido ao envolvimento do Charles Dietrich em outros projetos. De acordo com minhas necessidades, adicinei novas funcionalidades a bliboteca, expandindo a compatiblidade com o formato SVG. Ao submeter minhas modificações ao mantenedor da biblioteca, ele convidou-me a dar continuidade à mesma.
&lt;br&gt;&lt;br&gt;
Hoje considero a biblioteca em um estado muito satisfatório, suportando muitas das características do SVG.&lt;/div&gt;
&lt;br&gt;&lt;br&gt;
&lt;a href="http://4.bp.blogspot.com/_lkrXmOrrABs/Sl-0MDyuTeI/AAAAAAAAAAU/O0eH6PlijtA/s1600-h/as3svgrenderer.png"&gt;&lt;img style="TEXT-ALIGN: left; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 180px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5359200200863665634" border="0" alt="" src="http://4.bp.blogspot.com/_lkrXmOrrABs/Sl-0MDyuTeI/AAAAAAAAAAU/O0eH6PlijtA/s400/as3svgrenderer.png" /&gt;&lt;/a&gt;
&lt;span style="font-size:85%;"&gt;Exemplos de imagens geradas com a bilbioteca.&lt;/span&gt;
&lt;br&gt;&lt;br&gt;
&lt;div&gt;Caso queira alguma explicação sobre a utlização da bilbioteca, dar sugestões, pedir correções, discutir idéias, e outros, deixe uma mensagem no blog ou mande um e-mail.
&lt;br&gt;&lt;br&gt;
Gostaria de ser informado a respeito de projetos que utilizem a biblioteca. Saber o quão útil a biblioteca é para outras pessoas, é um forte fator de motivação para dar continuidade à mesma.
&lt;br&gt;&lt;br&gt;
Abraços.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7988108898550161910-3656450212979015741?l=www.lucaslorentz.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.lucaslorentz.com.br/feeds/3656450212979015741/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.lucaslorentz.com.br/2009/07/as3-svg-renderer.html#comment-form' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/3656450212979015741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7988108898550161910/posts/default/3656450212979015741'/><link rel='alternate' type='text/html' href='http://www.lucaslorentz.com.br/2009/07/as3-svg-renderer.html' title='AS3 SVG Renderer'/><author><name>Lucas Lorentz</name><uri>http://www.blogger.com/profile/01725138003009894276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_lkrXmOrrABs/TNbEdGRWbdI/AAAAAAAAACk/v_wEbU9YHPQ/S220/foto.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_lkrXmOrrABs/Sl-0MDyuTeI/AAAAAAAAAAU/O0eH6PlijtA/s72-c/as3svgrenderer.png' height='72' width='72'/><thr:total>9</thr:total></entry></feed>
