<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Algumas Idéias &#187; .NET</title>
	<atom:link href="http://algumasideias.net/category/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://algumasideias.net</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 11 Apr 2010 03:53:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Usando o Castle ActiveRecord</title>
		<link>http://algumasideias.net/2008/03/27/usando-o-castle-activerecord/</link>
		<comments>http://algumasideias.net/2008/03/27/usando-o-castle-activerecord/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 00:11:48 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://algumasideias.net/2008/03/27/usando-o-castle-activerecord/</guid>
		<description><![CDATA[O Castle ActiveRecord é uma implementação do pattern Active Record desenvolvido em .NET em cima do NHibernate.
Ele faz parte do pacote de frameworks do projeto Castle Projet, e tem forte influencia da implementação do Active Record do framework Ruby On Rails.
Entre as muitas características dele vale destacar, a possibilidade de mapeamento de classes via atributos [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://www.castleproject.org/activerecord/index.html">Castle ActiveRecord</a> é uma implementação do pattern <a href="http://martinfowler.com/eaaCatalog/activeRecord.html">Active Record</a> desenvolvido em .NET em cima do <a href="http://www.nhibernate.org">NHibernate</a>.</p>
<p>Ele faz parte do pacote de frameworks do projeto <a href="http://www.castleproject.org">Castle Projet</a>, e tem forte influencia da implementação do <a href="http://ar.rubyonrails.org">Active Record</a> do framework <a href="http://www.rubyonrails.org">Ruby On Rails</a>.</p>
<p>Entre as muitas características dele vale destacar, a possibilidade de mapeamento de classes via atributos e não dos famigerados arquivos xml e um mecanismo de validação eficiente e flexível.</p>
<p><span id="more-21"></span></p>
<h4>Criando o projeto</h4>
<p>Acesse a página de <a href="http://www.castleproject.org/castle/download.html">download</a> do projeto, baixe o arquivo <a href="http://prdownloads.sourceforge.net/castleproject/Castle-net-2.0-release-2007-9-20.zip?download">Castle-net-2.0-release-2007-9-20.zip</a> e descompacte em algum diretório da sua preferência.</p>
<p>Em seguida crie um novo projeto web e faça referência as assemblies abaixo:</p>
<blockquote><p>Castle.ActiveRecord.dll<br />
Castle.Core.dll<br />
Castle.Components.Validator.dll<br />
Castle.DynamicProxy.dll<br />
NHibernate.dll<br />
Iesi.Collections.dll<br />
log4net.dll</p></blockquote>
<h4>Criando a tabela de Contatos</h4>
<p>Crie uma base de dados chamada ContatosAR e em seguida crie uma tabela com a estrutura abaixo.</p>
<pre>CREATE TABLE [dbo].[Contatos](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Nome] [varchar](255) NOT NULL,
	[Email] [varchar](255) NOT NULL,
 CONSTRAINT [PK_Contatos] PRIMARY KEY CLUSTERED
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]</pre>
<h4>Criando a classe Contato</h4>
<p>Agora vamos criar a classe que vai representar a nossa tabela.</p>
<pre>using System;

public class Contato
{
  private int id;
  private string nome;
  private string email;

  public int Id
  {
    get { return id; }
    set { id = value; }
  }

  public string Nome
  {
    get { return nome; }
    set { nome = value; }
  }

  public string Email
  {
    get { return email; }
    set { email = value; }
  }
}</pre>
<h4>Mapeando a classe Contato</h4>
<p>Mapeando a nossa classe para o NHibernate. Só que em vez do xml entra em cena os atributos disponíveis no ActiveRecord.</p>
<pre>[ActiveRecord("Contatos")]
public class Contato : ActiveRecordValidationBase&lt;Contato&gt;
{
    private int id;
    private string nome;
    private string email;

    [PrimaryKey(PrimaryKeyType.Native, "Id")]
    public int Id
    {
      get { return id; }
      set { id = value; }
    }

    [Property("Nome")]
    [ValidateNonEmpty("Nome é requirido")]
    [ValidateLength(1, 255, "Nome deve ter no máximo 255 caracteres")]
    public string Nome
    {
      get { return nome; }
      set { nome = value; }
    }

    [Property("Email")]
    [ValidateNonEmpty("E-mail é requirido")]
    [ValidateLength(1, 255, "E-mail deve ter no máximo 255 caracteres")]
    [ValidateEmail("E-mail inválido")]
    public string Email
    {
      get { return email; }
      set { email = value; }
    }
}</pre>
<h4>Configurando o ActiveRecord</h4>
<p>No arquivo Web.Config adicione o código abaixo e altere a chave hibernate.connection.connection_string para apontar para a sua instância do SQL Server.</p>
<pre>&lt;?xml version="1.0"?&gt;

&lt;configuration&gt;
  &lt;configSections&gt;
    &lt;section name="activerecord"
                   type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord" /&gt;
  &lt;/configSections&gt;

  &lt;activerecord isWeb="true"&gt;
    &lt;config&gt;
      &lt;add key="hibernate.connection.driver_class"
                 value="NHibernate.Driver.SqlClientDriver" /&gt;
      &lt;add key="hibernate.dialect"
                 value="NHibernate.Dialect.MsSql2005Dialect" /&gt;
      &lt;add key="hibernate.connection.provider"
                 value="NHibernate.Connection.DriverConnectionProvider" /&gt;
      &lt;add key="hibernate.connection.connection_string"
                 value="Data Source=.;Initial Catalog=ContatosAR;Integrated Security=True" /&gt;
    &lt;/config&gt;
  &lt;/activerecord&gt;
&lt;/configuration&gt;</pre>
<p>E no arquivo Global.asax adicione o código abaixo.</p>
<pre>&lt;%@ Application Language="C#" %&gt;

&lt;%@ Import Namespace="Castle.ActiveRecord" %&gt;
&lt;%@ Import Namespace="Castle.ActiveRecord.Framework" %&gt;
&lt;%@ Import Namespace="Castle.ActiveRecord.Framework.Config" %&gt;

&lt;script runat="server"&gt;
    void Application_Start(object sender, EventArgs e)
    {
        IConfigurationSource source = ActiveRecordSectionHandler.Instance;
        ActiveRecordStarter.Initialize(source, typeof(Contato));
    }
&lt;/script&gt;</pre>
<h4>Listando os contatos</h4>
<p>Agora, com o ActiveRecord configurado, vamos criar uma página para listar todos os contatos cadastrados na base de dados (nenhum até o momento).</p>
<pre>&lt;asp:GridView ID="gvContatos" AutoGenerateColumns="false" runat="server"&gt;
    &lt;Columns&gt;
        &lt;asp:HyperLinkField DataNavigateUrlFields="Id"
                DataNavigateUrlFormatString="EditarContato.aspx?Id={0}"
		DataTextField="Nome" HeaderText="Nome" /&gt;

	    &lt;asp:BoundField DataField="Email" HeaderText="E-mail" /&gt;
    &lt;/Columns&gt;
&lt;/asp:GridView&gt;</pre>
<p>ListarContatos.aspx.cs</p>
<pre>public partial class ListarContatos : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        gvContatos.DataSource = Contato.FindAll();
        gvContatos.DataBind();
    }
}</pre>
<h4>Inserindo um contato</h4>
<p>Montando o formulário de inserção. De propósito vou deixar para fazer a validação no servidor.</p>
<pre>&lt;h3&gt;Novo contato&lt;/h3&gt;

&lt;asp:Panel ID="pnMensagem" runat="server" Visible="false"&gt;
    &lt;asp:Label ID="lblMensagem" runat="server" /&gt;
&lt;/asp:Panel&gt;

&lt;p&gt;
    &lt;asp:Label ID="lblNome" runat="server" AssociatedControlID="txtNome"&gt;Nome:&lt;/asp:Label&gt;
    &lt;asp:TextBox ID="txtNome" runat="server" Columns="40" MaxLength="255"&gt;&lt;/asp:TextBox&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;asp:Label ID="lblEmail" runat="server" AssociatedControlID="txtEmail"&gt;E-mail:&lt;/asp:Label&gt;
    &lt;asp:TextBox ID="txtEmail" runat="server" Columns="40" MaxLength="255"&gt;&lt;/asp:TextBox&gt;
&lt;/p&gt;				

&lt;asp:Button ID="btnSalvar" runat="server" OnClick="btnSalvar_Click" Text="Salvar" /&gt;
ou &lt;a href="ListarContatos.aspx"&gt;Voltar&lt;/a&gt;</pre>
<p>NovoContato.aspx.cs</p>
<pre>public partial class NovoContato : System.Web.UI.Page
{
    protected void btnSalvar_Click(object sender, EventArgs e)
    {
        pnMensagem.Visible = true;
        lblMensagem.Text = "";

        Contato contato = new Contato();

        contato.Nome = txtNome.Text;
        contato.Email = txtEmail.Text;

        if (contato.IsValid())
        {
            contato.Create();

            lblMensagem.Text = "Contato criado com sucesso.";

            txtNome.Text = "";
            txtEmail.Text = "";
        }
        else
        {
            foreach (string s in contato.ValidationErrorMessages)
                lblMensagem.Text += s;
        }
    }
}</pre>
<h4>Editando um contato</h4>
<pre>&lt;h3&gt;Editar contato&lt;/h3&gt;

&lt;asp:Panel ID="pnMensagem" runat="server" Visible="false"&gt;
    &lt;asp:Label ID="lblMensagem" runat="server" /&gt;
&lt;/asp:Panel&gt;

&lt;p&gt;
    &lt;asp:Label ID="lblNome" runat="server" AssociatedControlID="txtNome"&gt;Nome:&lt;/asp:Label&gt;
    &lt;asp:TextBox ID="txtNome" runat="server" Columns="40" MaxLength="255"&gt;&lt;/asp:TextBox&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;asp:Label ID="lblEmail" runat="server" AssociatedControlID="txtEmail"&gt;E-mail:&lt;/asp:Label&gt;
    &lt;asp:TextBox ID="txtEmail" runat="server" Columns="40" MaxLength="255"&gt;&lt;/asp:TextBox&gt;
&lt;/p&gt;				

&lt;asp:Button ID="btnSalvar" runat="server" OnClick="btnSalvar_Click" Text="Salvar" /&gt;
ou &lt;a href="ListarContatos.aspx"&gt;Voltar&lt;/a&gt;</pre>
<p>EditarContato.aspx.cs</p>
<pre>public partial class EditarContato : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Contato contato = Contato.Find(Convert.ToInt32(Request.QueryString["Id"]));

            txtNome.Text = contato.Nome;
            txtEmail.Text = contato.Email;
        }
    }

    protected void btnSalvar_Click(object sender, EventArgs e)
    {
        pnMensagem.Visible = true;
        lblMensagem.Text = "";

        Contato contato = Contato.Find(Convert.ToInt32(Request.QueryString["Id"]));

        contato.Nome = txtNome.Text;
        contato.Email = txtEmail.Text;

        if (contato.IsValid())
        {
            contato.Update();

            lblMensagem.Text = "Dados do contato atualizados com sucesso.";
        }
        else
        {
            foreach (string s in contato.ValidationErrorMessages)
                lblMensagem.Text += s;
        }
    }
}</pre>
<h4>Código do projeto</h4>
<p>O <a href='http://algumasideias.net/wp-content/uploads/2008/03/contatosar.zip' title='Cadastro de Contatos'>código do projeto</a> está disponivel para download.</p>
<p>Ele foi desenvolvido usando o Microsoft Visual Web Developer 2008 Express Edition com o SQL Server Express 2005.</p>
<h4>Em breve</h4>
<p>Depois dessa passada superficial vou tentar preparar uma série de posts detalhando mais as funcionalidades do framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/03/27/usando-o-castle-activerecord/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Automatic Properties</title>
		<link>http://algumasideias.net/2008/03/27/automatic-properties/</link>
		<comments>http://algumasideias.net/2008/03/27/automatic-properties/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 13:31:21 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://algumasideias.net/2008/03/27/automatic-properties/</guid>
		<description><![CDATA[No post anterior acabei usando um recurso disponível no C# 3.0 que ficou sem explicação.
O Automatic Properties.
public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
}
Agora ao encontrar a declaração { get; set; }, o compilador gera automaticamente a variável privada e a implementação necessária para a [...]]]></description>
			<content:encoded><![CDATA[<p>No post anterior acabei usando um recurso disponível no C# 3.0 que ficou sem explicação.</p>
<p>O Automatic Properties.</p>
<pre>public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
}</pre>
<p>Agora ao encontrar a declaração { get; set; }, o compilador gera automaticamente a variável privada e a implementação necessária para a propriedade.</p>
<p>Também é possível declarar uma propriedade como somente leitura usando o accessor private.</p>
<pre>public class Pessoa {
  public int Id { get; private set; }
  public string Nome { get; set; }
  public string Email { get; set; }
}</pre>
<p>E caso você precise usar atributos é necessário fazer a declaração da propriedade do modo tradicional.</p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/03/27/automatic-properties/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Object e Collection Initializers</title>
		<link>http://algumasideias.net/2008/03/27/object-e-collection-initializers/</link>
		<comments>http://algumasideias.net/2008/03/27/object-e-collection-initializers/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 13:05:57 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://algumasideias.net/2008/03/27/object-e-collection-initializers/</guid>
		<description><![CDATA[Mais uma novidade do C# 3.0 é a nova sintaxe para a inicialização de objetos e coleções.
Object Initializers
Agora podemos ao instanciar um objeto passar valores para as suas propriedades.
public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
} 

Pessoa joao = new Pessoa() { Nome = "João", [...]]]></description>
			<content:encoded><![CDATA[<p>Mais uma novidade do C# 3.0 é a nova sintaxe para a inicialização de objetos e coleções.</p>
<h4>Object Initializers</h4>
<p>Agora podemos ao instanciar um objeto passar valores para as suas propriedades.</p>
<pre>public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
} 

Pessoa joao = new Pessoa() { Nome = "João", Email = "joao@gmail.com" };
Pessoa maria = new Pessoa() { Nome = "Maria", Email = "maria@gmail.com" };</pre>
<p>No exemplo acima, são instanciados dois objetos do tipo Pessoa, chamando o construtor padrão, e em seguida setadas as propriedades Nome e Email.</p>
<p>Tudo em uma única linha de código.</p>
<p>Também é possível passar parâmetros para o construtor, conforme o exemplo a seguir:</p>
<pre>public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
  public int Idade { get; set; }</pre>
<pre>  public Pessoa(string nome)
  {
    this.Nome = nome;
  }
}</pre>
<pre>Pessoa pedro = new Pessoa("Pedro") {
  Email = "pedro@gmail.com",
  Idade = 20
};</pre>
<h4>Collection Initializers</h4>
<p>Já nas coleções podemos passar um conjunto de objetos.</p>
<p>No exemplo abaixo a coleção pessoas é instanciada com os objetos joao, maria e pedro como os seus membros.</p>
<pre>IList&lt;Pessoa&gt; pessoas = new List&lt;Pessoa&gt;() { joao, maria, pedro }</pre>
<p>É aqui uma combinação das duas formas.</p>
<pre>IList&lt;Pessoa&gt; pessoas = new List&lt;Pessoa&gt;() {
  joao, maria, pedro,
  new Pessoa() { Nome = "Jose", Email = "jose@gmail.com" }
}</pre>
<h4>Conclusão</h4>
<p>Como vimos nesse segundo post, o C# 3.0 vem trazendo grandes melhorias para a implementação de um código mais legível e bonito.</p>
<p>Muitas dessas melhorias foram influenciadas por dois projetos da Microsoft Research, o <a href="http://research.microsoft.com/fsharp">F#</a> e o <a href="http://research.microsoft.com/comega">Cω</a>.</p>
<p><a href="http://tomasp.net/articles/csharp3-concepts.aspx">Nesse post</a>, Tomas Petricek detalha as novidades incorporadas no C# 3.0 vindas desses dois projetos.</p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/03/27/object-e-collection-initializers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extension Methods</title>
		<link>http://algumasideias.net/2008/03/26/extension-methods/</link>
		<comments>http://algumasideias.net/2008/03/26/extension-methods/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 00:18:26 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://algumasideias.net/2008/03/26/extension-methods-2/</guid>
		<description><![CDATA[Umas das novidades do C# 3.0 é a possibilidade de adicionar comportamento a uma classe sem a necessidade da criação de uma subclasse ou da recompilação do código original.
Essa funcionalidade é chamada de Extension Methods.
Criando um Extension Method
Imagine que você precisa validar se uma string é um e-mail válido. A solução mais comum é a [...]]]></description>
			<content:encoded><![CDATA[<p>Umas das novidades do C# 3.0 é a possibilidade de adicionar comportamento a uma classe sem a necessidade da criação de uma subclasse ou da recompilação do código original.</p>
<p>Essa funcionalidade é chamada de Extension Methods.</p>
<h4>Criando um Extension Method</h4>
<p>Imagine que você precisa validar se uma string é um e-mail válido. A solução mais comum é a definição de um método de validação (estático) em uma classe utilitária (estática).</p>
<pre>static class Program
{
  static void Main(string[] args)
  {
    string emailCliente = System.Console.ReadLine();

    if (!Utilidades.IsEmailValido(emailCliente))
      System.Console.WriteLine("E-mail informado inválido.");
  }
}</pre>
<p>Usando um Extension Method a solução é parecida, mas a utilização é mais elegante.</p>
<pre><code>if (!emailCliente.IsEmailValido())
  System.Console.WriteLine("E-mail informado inválido.");</code></pre>
<p>A criação do Extension Method se resume a definição de uma classe estática com um método estático.</p>
<pre>namespace Utilidades
  public static class Extensoes
  {
    public static bool IsEmailValido(this string email)
    {
      return Regex.IsMatch(email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
    }
  }
}</pre>
<p>Notem o keyword this antes da declaração do primeiro parâmetro. Ele é responsável por passar ao compilador que o método IsEmailValido é aplicável a todos os objetos do tipo string.</p>
<p>E para utilizar o extension method basta importar o namespace que contém a classe estática usando o statement using. Sendo que não é necessária a importação caso as classes estejam dentro do mesmo namespace.</p>
<pre>using Utilidades;</pre>
<h4>Passando parâmetros para o Extension Method</h4>
<pre>namespace Utilidades
  public static class Extensoes
  {
    public static bool IsMaiorQue(this string s, int tamanho)
    {
      return s.Length &gt; tamanho;
    }
  }
}

string nome = "Joao da Silva";

if (nome.IsMaiorQue(10))
  System.Console.WriteLn("Nome só pode ter 10 caracteres");</pre>
<p>Com essa introdução dá para ter uma pequena idéia das possibilidades. Vale lembrar que também é possível criar extension methods para interfaces e generics.</p>
<p>Abaixo três boas referências que valem à pena dar uma lida.</p>
<ul>
<li><a href="http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx">http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic3">http://msdn2.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic3</a></li>
<li><a href="http://blogs.msdn.com/vbteam/pages/articles-about-extension-methods.aspx">http://blogs.msdn.com/vbteam/pages/articles-about-extension-methods.aspx</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/03/26/extension-methods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
