<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss 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" version="2.0">

<channel>
	<title>Algumas Idéias</title>
	
	<link>http://algumasideias.net</link>
	<description>Just another WordPress weblog</description>
	<pubDate>Wed, 15 Oct 2008 20:33:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/algumasideias" type="application/rss+xml" /><item>
		<title>Rails for .NET Developers</title>
		<link>http://algumasideias.net/2008/10/15/rails-for-net-developers/</link>
		<comments>http://algumasideias.net/2008/10/15/rails-for-net-developers/#comments</comments>
		<pubDate>Wed, 15 Oct 2008 20:33:16 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://algumasideias.net/?p=52</guid>
		<description><![CDATA[Brian Eng acaba de anunciar em seu blog, o Softies on Rails, que o livro Rails for .NET Developers escrito por ele e seu companheiro de blog Jeff Cohen já esta disponível na Pragmatic Bookshelf.
Disponível em PDF e &#8220;papel&#8221; o livro funciona como um guia para quem desenvolve em .NET dar os primeiros passos no [...]]]></description>
			<content:encoded><![CDATA[<p>Brian Eng acaba de <a href="http://www.softiesonrails.com/2008/10/15/rails-for-net-developers-now-shipping-pragmatic-podcast">anunciar</a> em seu blog, o <a href="http://www.softiesonrails.com/">Softies on Rails</a>, que o livro Rails for .NET Developers escrito por ele e seu companheiro de blog Jeff Cohen já esta <a href="http://pragprog.com/titles/cerailn/rails-for-net-developers">disponível</a> na <a href="http://pragprog.com">Pragmatic Bookshelf</a>.</p>
<p>Disponível em PDF e &#8220;papel&#8221; o livro funciona como um guia para quem desenvolve em .NET dar os primeiros passos no mundo Ruby On Rails.</p>
<p>Já adicionei na minha lista de futuras aquisições.</p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/10/15/rails-for-net-developers/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Silverlight 2 &amp; SDK</title>
		<link>http://algumasideias.net/2008/10/14/silverlight-2-sdk/</link>
		<comments>http://algumasideias.net/2008/10/14/silverlight-2-sdk/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 12:41:31 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://r.algumasideias.net/?p=48</guid>
		<description><![CDATA[Com o lançamento do Silverlight 2 também já esta disponível para download a nova versão de seu SDK.
Para quem usa o Visual Studio 2008 ou o Visual Studio 2008 Express é recomendado baixar o add-on: Silverlight Tools for Visual Studio 2008 SP1. 
Este pacote instala o runtime de desenvolvimento do Silverlight, o SDK e alguns [...]]]></description>
			<content:encoded><![CDATA[<p>Com o lançamento do <a href="http://www.silverlight.net/">Silverlight 2</a> também já esta disponível para download a nova versão de seu <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=8d933343-038f-499c-986c-c3c7e87a60b3&#038;DisplayLang=en">SDK</a>.</p>
<p>Para quem usa o Visual Studio 2008 ou o Visual Studio 2008 Express é recomendado baixar o add-on: <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=c22d6a7b-546f-4407-8ef6-d60c8ee221ed&#038;displaylang=en">Silverlight Tools for Visual Studio 2008 SP1</a>. </p>
<p>Este pacote instala o runtime de desenvolvimento do Silverlight, o SDK e alguns updates necessários para o Visual Studio.</p>
<p>Só lembrando que é necessário ter o SP1 do Visual Studio instalado.</p>
<p>Já para quem usa o Blender é necessário instalar o <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=eb9b5c48-ba2b-4c39-a1c3-135c60bbbe66&#038;DisplayLang=en">Microsoft Expression Blend 2 Service Pack 1</a> para habilitar o suporte ao Silverlight 2.</p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/10/14/silverlight-2-sdk/feed/</wfw:commentRss>
		</item>
		<item>
		<title>gem install versus proxy</title>
		<link>http://algumasideias.net/2008/10/06/gem-install-versus-proxy/</link>
		<comments>http://algumasideias.net/2008/10/06/gem-install-versus-proxy/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 17:37:14 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
		
		<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://r.algumasideias.net/?p=44</guid>
		<description><![CDATA[Caso você use Windows e esteja tentando executar um gem install por trás de um proxy é bem provável que você esteja recebendo a mensagem:
ERROR: While executing gem … (Gem::RemoteSourceException)
HTTP Response 407
Se for o caso basta executar os passos abaixo para contornar o problema.
Variável de ambiente HTTP_PROXY
Crie uma variável de ambiente chamada HTTP_PROXY apontando para [...]]]></description>
			<content:encoded><![CDATA[<p>Caso você use Windows e esteja tentando executar um gem install por trás de um proxy é bem provável que você esteja recebendo a mensagem:</p>
<pre>ERROR: While executing gem … (Gem::RemoteSourceException)
HTTP Response 407</pre>
<p>Se for o caso basta executar os passos abaixo para contornar o problema.</p>
<h4>Variável de ambiente HTTP_PROXY</h4>
<p>Crie uma variável de ambiente chamada HTTP_PROXY apontando para o endereço do proxy. O endereço deve seguir o padrão: http://URL:PORTA.</p>
<h4>Ruby Win32 SSPI</h4>
<p>Faça download da gem <a href="http://rubyforge.org/projects/rubysspi/">Ruby Win32 SSPI</a> e instale-a manualmente.</p>
<pre>gem i rubysspi-1.2.4.gem</pre>
<p>Em seguida copie o arquivo spa.rb do diretório de instalação da gem (C:\Ruby\lib\ruby\gems\1.8\gems\rubysspi-1.2.4) para o diretório site_ruby (C:\Ruby\lib\ruby\site_ruby) da instalação do Ruby.</p>
<h4>gem.bat</h4>
<p>Edite o arquivo gem.bat no diretório bin da instalação do Ruby e adicione “-rspa” a linha de comando. No meu caso ficou assim:</p>
<pre>@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"ruby.exe" -rspa "C:/Ruby/bin/gem" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"ruby.exe" -rspa "%~dpn0" %*</pre>
<h4>Por fim</h4>
<p>Tenho certeza que já tinha postado isso na versão anterior do blog, mas como tive que fazer todo esse processo novamente resolvi listar os passos e deixar documentado por aqui.</p>
<p>E se você atualizar a versão da rubygem (gem update –system) lembre-se de repetir o passo acima novamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/10/06/gem-install-versus-proxy/feed/</wfw:commentRss>
		</item>
		<item>
		<title>GitX</title>
		<link>http://algumasideias.net/2008/10/06/gitx/</link>
		<comments>http://algumasideias.net/2008/10/06/gitx/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 12:39:31 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
		
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://r.algumasideias.net/?p=41</guid>
		<description><![CDATA[What is GitX?
GitX is a gitk like clone written specifically for OS X Leopard and higher. This means that it has a native interface and tries to integrate with the operating system as good as possible. Examples of this are drag and drop support and QuickLook support.
Ainda não consegui testar o programa mas o screencast [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>What is GitX?</strong></p>
<p>GitX is a gitk like clone written specifically for OS X Leopard and higher. This means that it has a native interface and tries to integrate with the operating system as good as possible. Examples of this are drag and drop support and QuickLook support.</p></blockquote>
<p>Ainda não consegui testar o programa mas o <a href="http://frim.frim.nl/GitX6.mov">screencast</a> me deixou animado.</p>
<p>Mais detalhes em <a href="http://github.com/pieter/gitx/wikis">http://github.com/pieter/gitx/wikis</a> e <a href="http://frim.frim.nl/gitx/UserManual.html">http://frim.frim.nl/gitx/UserManual.html</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/10/06/gitx/feed/</wfw:commentRss>
<enclosure url="http://frim.frim.nl/GitX6.mov" length="4636101" type="video/quicktime" />
		</item>
		<item>
		<title>Fluent Argument Validation</title>
		<link>http://algumasideias.net/2008/08/31/fluent-argument-validation/</link>
		<comments>http://algumasideias.net/2008/08/31/fluent-argument-validation/#comments</comments>
		<pubDate>Sun, 31 Aug 2008 17:21:54 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://algumasideias.net/?p=32</guid>
		<description><![CDATA[Um bom exemplo de como usar uma fluent interface para fazer validação de pré e pós condições escrito por Roger Alsing.
Ele até empacotou tudo em um &#8220;framework&#8221;.
E por falar em fluent interfaces, o Guilherme Chapiewski fez dois ótimos posts a alguns meses.
static string ValidationFunc(int a,string b,DateTime c)
{
  //pre conditions:
  a.Require("a")
   .IsGreaterThan(10);

 [...]]]></description>
			<content:encoded><![CDATA[<p>Um <a href="http://rogeralsing.com/2008/05/10/followup-how-to-validate-a-methods-arguments/">bom exemplo</a> de como usar uma fluent interface para fazer validação de pré e pós condições escrito por Roger Alsing.</p>
<p>Ele até <a href="http://rogeralsing.com/2008/05/28/argument-validation-framework-released/">empacotou tudo</a> em um &#8220;framework&#8221;.</p>
<p>E por falar em fluent interfaces, o Guilherme Chapiewski fez <a href="http://gc.blog.br/2007/09/25/refatorando-para-fluent-interface/">dois</a> <a href="http://gc.blog.br/2008/03/03/um-exemplo-pratico-de-fluent-interface/">ótimos</a> posts a alguns meses.</p>
<pre>static string ValidationFunc(int a,string b,DateTime c)
{
  //pre conditions:
  a.Require("a")
   .IsGreaterThan(10);

  b.Require("b")
   .NotNull()
   .NotEmpty()
   .LongerThan(2)
   .StartsWith("Ro");

  c.Require("c")
   .IsInRange(new DateTime(2000, 01, 01),
   new DateTime(2010, 01, 01));</pre>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/08/31/fluent-argument-validation/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Problemas com o RedCloth</title>
		<link>http://algumasideias.net/2008/03/31/problemas-com-o-redcloth/</link>
		<comments>http://algumasideias.net/2008/03/31/problemas-com-o-redcloth/#comments</comments>
		<pubDate>Mon, 31 Mar 2008 12:09:07 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
		
		<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://algumasideias.net/?p=27</guid>
		<description><![CDATA[Usando o helper textilize notei que ele estava tendo um comportamento estranho quando o texto tinha quebras de linha.
Fuçando no wiki descobri que a versão 3.0.4 da gem RedCloth, utilizada pelo helper, tem um bug que não identifica corretamente as quebras de linha como parágrafos.
Como solução, é indicado o downgrade/atualização para as versões 3.0.3 ou [...]]]></description>
			<content:encoded><![CDATA[<p>Usando o helper <a href="http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#M001054">textilize</a> notei que ele estava tendo um comportamento estranho quando o texto tinha quebras de linha.</p>
<p>Fuçando no <a href="http://wiki.rubyonrails.org/rails/pages/redcloth">wiki</a> descobri que a versão 3.0.4 da gem <a href="http://whytheluckystiff.net/ruby/redcloth/">RedCloth</a>, utilizada pelo helper, tem um bug que não identifica corretamente as quebras de linha como parágrafos.</p>
<p>Como solução, é indicado o downgrade/atualização para as versões 3.0.3 ou 4.0 da gem (ainda em desenvolvimento) ou a utilização do patch abaixo no environment.rb.</p>
<pre>class RedCloth
  # Patch for RedCloth.  Fixed in RedCloth r128 but _why hasn't released it yet.
  # <a href="http://code.whytheluckystiff.net/redcloth/changeset/128">http://code.whytheluckystiff.net/redcloth/changeset/128</a>
  def hard_break( text )
    text.gsub!( /(.)\n(?!\n|\Z| *([#*=]+(\s|$)|[{|]))/, "\\1" ) if hard_breaks
  end
end</pre>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/03/31/problemas-com-o-redcloth/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A receita do fracasso</title>
		<link>http://algumasideias.net/2008/03/27/a-receita-do-fracasso/</link>
		<comments>http://algumasideias.net/2008/03/27/a-receita-do-fracasso/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 00:45:53 +0000</pubDate>
		<dc:creator>Fabiano França</dc:creator>
		
		<category><![CDATA[Achados e perdidos]]></category>

		<guid isPermaLink="false">http://algumasideias.net/2008/03/27/a-receita-do-fracasso/</guid>
		<description><![CDATA[Será que existe alguém que trabalhe com TI que nunca passou ou vivenciou uma situação parecida com essa?
Você planeja seus projetos, por menor que sejam? Um caso que deu MUITO errado.
]]></description>
			<content:encoded><![CDATA[<p>Será que existe alguém que trabalhe com TI que nunca passou ou vivenciou uma situação parecida com essa?</p>
<blockquote><p><a href="http://www.meiobit.com/vocecirc-planeja-seus-projetos-por-menor-que-sejam">Você planeja seus projetos, por menor que sejam? Um caso que deu MUITO errado.</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://algumasideias.net/2008/03/27/a-receita-do-fracasso/feed/</wfw:commentRss>
		</item>
		<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>
		</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>
		</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>
		</item>
	</channel>
</rss><!-- Dynamic Page Served (once) in -1.475 seconds -->
