<?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>tucaz.blog.now() &#187; C#</title>
	<atom:link href="http://blog.tucaz.net/category/desenvolvimento/c-desenvolvimento/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tucaz.net</link>
	<description>Software architecture, agile and all that stuff that you can find everywhere</description>
	<lastBuildDate>Tue, 11 Jan 2011 21:00:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Lendo e consumindo XML com dynamic em C# 4</title>
		<link>http://blog.tucaz.net/2010/11/18/lendo-e-consumindo-xml-com-dynamic-em-c-4/</link>
		<comments>http://blog.tucaz.net/2010/11/18/lendo-e-consumindo-xml-com-dynamic-em-c-4/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 23:57:30 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=474</guid>
		<description><![CDATA[Sei que faz tempo que não posto então aqui vai um post rápido, mas com conteúdo (espero que vocês vejam dessa forma também). Finalmente comecei a trabalhar efetivamente com C# 4 e por coincidência (ou não) já precisei de dynamic objects pra resolver um problema.
Meu sistema recebe como entrada alguns arquivos XML para serem processados [...]]]></description>
			<content:encoded><![CDATA[<p>Sei que faz tempo que não posto então aqui vai um post rápido, mas com conteúdo (espero que vocês vejam dessa forma também). Finalmente comecei a trabalhar efetivamente com C# 4 e por coincidência (ou não) já precisei de dynamic objects pra resolver um problema.</p>
<p>Meu sistema recebe como entrada alguns arquivos XML para serem processados e transformados em outros objetos posteriormente. XML é um saco e é definitivamente uma das coisas que eu mais odeio em desenvolvimento de software. Tudo com XML é trabalhoso. Sendo assim criei uma pequena Lib que transforma XML em objetos dinamicos pra eliminar a necessidade de lidar com nós e atributos diretamentes e também permitir futuras implementacões.</p>
<p>Com XmlToObjectParser é possível:</p>
<pre class="xml" name="code">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;catalog&gt;
  &lt;cd country="USA"&gt;
    &lt;title&gt;Empire Burlesque&lt;/title&gt;
    &lt;artist&gt;Bob Dylan&lt;/artist&gt;
    &lt;price&gt;10.90&lt;/price&gt;
  &lt;/cd&gt;
  &lt;cd country="UK"&gt;
    &lt;title&gt;Hide your heart&lt;/title&gt;
    &lt;artist&gt;Bonnie Tyler&lt;/artist&gt;
    &lt;price&gt;10.0&lt;/price&gt;
  &lt;/cd&gt;
  &lt;cd country="USA"&gt;
    &lt;title&gt;Greatest Hits&lt;/title&gt;
    &lt;artist&gt;Dolly Parton&lt;/artist&gt;
    &lt;price&gt;9.90&lt;/price&gt;
  &lt;/cd&gt;
&lt;/catalog&gt;
</pre>
<pre class="csharp" name="code">
var numberOfCDsinCatalog = catalog.catalog.cd.Count; //Retorna 3
var titleFromUKCD = catalog.catalog.cd[1].title; // Retorna "Hide your heart"
</pre>
<p>Bem mais legível e prático de usar, na minha opinião.</p>
<p>O <a href="https://github.com/tucaz/XmlToObjectParser">projeto</a> e a <a href="https://github.com/downloads/tucaz/XmlToObjectParser/XmlToObjectParser-1.0.zip">DLL compilada</a> estão no GitHub assim como a <a href="https://github.com/tucaz/XmlToObjectParser/wiki/Getting-Started">documentacão e informacões adicionais</a>.</p>
<p>Enjoy! <img src='http://blog.tucaz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2010/11/18/lendo-e-consumindo-xml-com-dynamic-em-c-4/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Performance: NHibernate versus ADO.NET</title>
		<link>http://blog.tucaz.net/2010/08/31/performance-nhibernate-versus-ado-net/</link>
		<comments>http://blog.tucaz.net/2010/08/31/performance-nhibernate-versus-ado-net/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 01:18:21 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[NHibernate]]></category>
		<category><![CDATA[adhoc]]></category>
		<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[stored procedures]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=466</guid>
		<description><![CDATA[Disclaimer
Os testes neste post apresentados não representam uma amostra exata ou fidedigna que represente uma condição real de acesso a dados de uma aplicação a fim de comparar a performance das duas tecnologias. A idéia é apenas mostrar alguns dados e exemplos com o objetivo de dismistificar a idéia de que ORM é uma ferramenta [...]]]></description>
			<content:encoded><![CDATA[<h1><em><span style="color: #ff0000">Disclaimer</span></em></h1>
<p><em><span style="color: #ff0000">Os testes neste post apresentados não representam uma amostra exata ou fidedigna que represente uma condição real de acesso a dados de uma aplicação a fim de comparar a performance das duas tecnologias. A idéia é apenas mostrar alguns dados e exemplos com o objetivo de dismistificar a idéia de que ORM é uma ferramenta lenta e estes testes são apenas um exercício.</span></em></p>
<p><em><span style="color: #ff0000">Sou usuário de NHibernate e defendo o uso de ORM’s portanto as conclusões apresentadas com certeza não são as mais imparciais possíveis.</span></em></p>
<p>Motivado <a title="DDD - Objetos de consulta usando ORM - o que vcs acham? @ DotNetArchitects" href="http://groups.google.com/group/dotnetarchitects/browse_thread/thread/dc01630511ec34ec">por esta thread no DNA hoje</a> decidi fazer alguns testes de perfomance pra comparar acesso a dados utilizando ADO.NET nativo (queries AdHoc e Stored Procedures) versus NHibernate.</p>
<p>Sempre rolam diversas discussões a respeito do assunto e a conclusão que geralmente se chega é de que qualquer ORM vai ser mais lento do que uma chamada nativa. É uma conclusão óbvia já que utilizar um ORM é adicionar uma camada de abstração a mais dentro da nossa aplicação. No entanto, até então eu nunca havia efetuado nenhuma medição pra ver qual a diferença de performance.</p>
<p>Todos os testes foram executados na minha máquina com código compilado em modo Release com banco de dados Sql Server 2008 também local.</p>
<p>Vamos aos testes.</p>
<h1>Cenário de testes</h1>
<p>Criei uma tabela (Product) e populei com cerca de 500 registros vindos do AdventureWorks (banco de dados exemplo do SqlServer).</p>
<p><a href="http://blog.tucaz.net/wp-content/uploads/2010/08/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Modelo de Dados" border="0" alt="Modelo de Dados" src="http://blog.tucaz.net/wp-content/uploads/2010/08/image_thumb.png" width="237" height="175" /></a></p>
<p>Contra essa tabela executei duas categorias de testes:</p>
<ol>
<li>Carregar todos os registros da tabela em um List&lt;&gt; </li>
<li>Carregar apenas um registro </li>
</ol>
<p>Pra ficar mais interessante fiz algumas variações dos testes:</p>
<ul>
<li>Query AdHoc/Inline </li>
<li>Query AdHoc/Inline com hidratação<strong>[1]</strong> via reflection </li>
<li>Query utilizando uma procedure </li>
<li>NHibernate com LINQ </li>
<li>NHibernate com HQL </li>
<li>NHibernate com Criteria </li>
<li>Nhibernate com Projections </li>
</ul>
<p>Como rodando uma única vez não foi possível obter dados suficientes, executei cada teste dentro de um loop com 1000 (numberOfIterations = 1000) iterações que resultou no código abaixo:</p>
<p>Método principal:</p>
<pre class="csharp" name="code">static void Main(string[] args)
{
    for (int i = 1; i &lt;= 3; i++)
    {
        Console.WriteLine(&quot;Test &quot; + i.ToString());
        Console.WriteLine(&quot;======================&quot;);

        SqlAdHocAllProducts();
        SqlAdHocAllProductsWithReflection();
        SProcAllProducts();
        NHibernateAllProductsWithLinq();
        NHibernateAllProductsWithHql();
        NHibernateAllProductsWithCriteria();
        NHibernateAllProductsWithProjections();

        SqlAdHocOneProduct();
        SqlAdHocOneProductWithReflection();
        SProcOneProduct();
        NHibernateOneProduct();

        Console.WriteLine();
    }

    Console.ReadLine();
}</pre>
<p>
  <br />Um dos métodos usando Sql AdHoc e outro usando NHibernate:</p>
<p></p>
<pre class="csharp" name="code">private static void SqlAdHocAllProducts()
{
    List&lt;Product&gt; allProducts = null;

    var connectionString = &quot;Data Source=(local);Integrated Security=SSPI;Database=TDC2010;&quot;;
    var select = @&quot;SELECT P.Id, P.Description, P.Name, P.Price FROM dbo.Product P&quot;;

    var connection = new SqlConnection(connectionString);
    connection.Open();

    Stopwatch watch = new Stopwatch();
    watch.Start();

    for (int i = 0; i &lt; numberOfIterations; i++)
    {
        allProducts = new List&lt;Product&gt;();
        var command = new SqlCommand(select, connection);
        var reader = command.ExecuteReader();

        while (reader.Read())
        {
            allProducts.Add(new Product()
                {

                    Id = Convert.ToInt32(reader[&quot;Id&quot;]),
                    Name = Convert.ToString(reader[&quot;Name&quot;]),
                    Description = Convert.ToString(reader[&quot;Description&quot;]),
                    Price = Convert.ToDecimal(reader[&quot;price&quot;])
                });
        }

        reader.Close();
    }

    watch.Stop();

    connection.Close();
    connection.Dispose();

    Console.WriteLine(
        &quot;Loading &quot; + allProducts.Count + &quot; Products with Sql AdHoc took &quot; + watch.ElapsedMilliseconds + &quot; ms&quot;);
}</pre>
<p>
  </p>
<pre class="csharp" name="code">private static void NHibernateAllProductsWithLinq()
{
    List&lt;Product&gt; allProducts = null;

    var session = CreateForSqlServer().OpenSession();

    Stopwatch watch = new Stopwatch();
    watch.Start();

    for (int i = 0; i &lt; numberOfIterations; i++)
    {
        allProducts = session.Linq&lt;Product&gt;().ToList();
    }

    watch.Stop();

    session.Close();

    Console.WriteLine(
        &quot;Loading &quot; + allProducts.Count + &quot; Products with NHibernate took &quot; + watch.ElapsedMilliseconds + &quot; ms&quot;);
}</pre>
<p><strong>Vou omitir o restante dos métodos para evitar duplicações já que eles são apenas variações dos dois exemplos acima.</strong></p>
<h1>Resultado Geral</h1>
<p><a href="http://blog.tucaz.net/wp-content/uploads/2010/08/image1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Resultados dos Testes" border="0" alt="Resultados dos Testes" src="http://blog.tucaz.net/wp-content/uploads/2010/08/image_thumb1.png" width="681" height="648" /></a></p>
<h1>Análise dos Resultados</h1>
<h3>Stored Procedures versus Queries AdHoc/Inline [500 registros]</h3>
<p>A diferença entre o uso de stored procedures e queries AdHoc é praticamente inexistente. A diferença média medida foi de <strong>menos de 1%</strong>.</p>
<p>Isso acontece, pois não existe complexidade suficiente neste tipo de query para que a armazenagem do plano de execução no banco de dados faça diferença.</p>
<p>Portanto, na grande maioria dos cenários Stored Procedures não são necessárias.</p>
<h3>NHibernate versus NHibernate [500 registros]</h3>
<p>Na média, todas as variações de consulta utilizando NHibernate também tiveram <strong>mais ou menos o mesmo resultado (~1500ms)</strong> com exceção do uso de <strong>Projections</strong>, que levou o dobro<strong> (~3000ms)</strong> do tempo.</p>
<p>Não conheço o NHibernate suficiente pra afirmar com 100% de certeza o motivo, mas acredito que seja pelo fato de esse tipo de query retornar Arrays bidimensionais que são criados e redimensionados em runtime até que todos os itens possam ser acomodados.</p>
<h3>NHibernate versus ADO.NET [500 registros]</h3>
<p>Este e o comparativo mais importante. Carregando (e hidratando) 500 registros o ADO.NET é cerca de <strong>30% mais</strong> rapido do que o NHibernate. A causa dessa discrepância é uma só e se chama reflection.</p>
<p>Apesar de todas as otimizações o NHibernate utiliza-se de reflection para efetuar a hidratação<strong>[1] </strong>de todos os objetos e é dai que vem a queda de performance que fica clara quando executamos queries AdHoc usando hidratação via reflection conforme o código abaixo.</p>
<pre class="csharp" name="code">private static void SqlAdHocAllProductsWithReflection()
{
    List&lt;Product&gt; allProducts = null;

    var connectionString = &quot;Data Source=(local);Integrated Security=SSPI;Database=TDC2010;&quot;;
    var select = @&quot;SELECT P.Id, P.Description, P.Name, P.Price FROM dbo.Product P&quot;;

    var connection = new SqlConnection(connectionString);
    connection.Open();

    Stopwatch watch = new Stopwatch();
    watch.Start();

    for (int i = 0; i &lt; numberOfIterations; i++)
    {
        allProducts = new List&lt;Product&gt;();
        var command = new SqlCommand(select, connection);
        var reader = command.ExecuteReader();

        while (reader.Read())
        {
            var newProduct = Activator.CreateInstance&lt;Product&gt;();
            SetProperty(newProduct, &quot;Id&quot;, Convert.ToInt32(reader[&quot;Id&quot;]));
            SetProperty(newProduct, &quot;Description&quot;, Convert.ToString(reader[&quot;Description&quot;]));
            SetProperty(newProduct, &quot;Name&quot;, Convert.ToString(reader[&quot;Name&quot;]));
            SetProperty(newProduct, &quot;Price&quot;, Convert.ToDecimal(reader[&quot;Price&quot;]));
            allProducts.Add(newProduct);
        }

        reader.Close();
    }

    watch.Stop();

    connection.Close();
    connection.Dispose();

    Console.WriteLine(
&quot;Loading &quot; + allProducts.Count + &quot; Products with Sql AdHoc and Reflection took &quot; + watch.ElapsedMilliseconds + &quot; ms&quot;);
}

private static void SetProperty(object instance, string property, object val)
{
    Type t = instance.GetType();
    var prop = t.GetProperty(property, BindingFlags.Instance | BindingFlags.Public);
    prop.SetValue(instance, val, null);
}</pre>
<p>Este código quando executado demora cerca de <strong>6000ms, ou 4 vezes mais</strong>, do que o código executado pelo NHibernate.</p>
<p>Mas por que a diferença não é de 30%? Porque o NHibernate possui otimizações quanto ao modo de hidratar um objeto via reflection. No meu código acima podemos ver, por exemplo, que toda vez que chamo o método SetProperty o Type da propriedade a ser refletida ainda não está criado. Provavelmente o NHibernate deve manter cache deste tipo de informação (e de outras) a fim de otimizar o processo de hidratação das entidades.</p>
<h3>Stored Procedures versus Queries AdHoc/Inline [1 registro]</h3>
<p>Mesmo resultado do cenário onde 500 registros são carregados. Não há diferença.</p>
<h3>NHibernate versus ADO.NET [1 registro]</h3>
<p>Aqui a diferença é gigantesca sendo de <strong>quase 4000% a favor do NHibernate. </strong>Isso acontece, pois o NHibernate implementa cache nível 1 nativamente então dentro de uma mesma ISession o objeto é carregado apenas uma vez enquanto com ADO.NET é necessário ir ao banco e carregar o objeto diversas vezes.</p>
<h1>Conclusões</h1>
<p>Olhando para os números apenas, em casos onde diversos registros precisam ser carregados, ADO.NET nativo oferece uma performance superior e parece ser a escolha óbvia. No entanto:</p>
<ul>
<li>Os testes com NHibernate foram executados utilizandos exemplos simples e sem qualquer tipo de otimização. </li>
<li>NHibernate oferece nativamente cache de resultados de queries e cache nível 2 que se utilizados iriam exibir um resultado bem próximo ao cenário “<em>NHibernate versus ADO.NET [1 registro]” </em>onde o NHibernate é 4 vezes mais rápido. </li>
<li>ADO.NET oferece um custo de desenvolvimento e manutenção altissimo e este custo torna-se ainda maior se utilizado com Stored Procedures que transformam o cenário em algo totalmente caótico de gerenciar devido a dificuldade de manter a rastreabilidade desses diabinhos malignos. </li>
</ul>
<p>No caso de sistemas <a title="OLTP @ Wikipedia" href="http://pt.wikipedia.org/wiki/OLTP">OLTP</a> onde as transações carregam unidades individuais e/ou pequenas coleções de entidades por sessão, NHibernate não só é mais rápido como também oferece muito mais flexibilidade pra lidar com praticamente todos os cenários existentes. <a title="25 reasons not to write your own ORM @ Ayende&#39;s Blog" href="http://ayende.com/Blog/archive/2006/05/12/25ReasonsNotToWriteYourOwnObjectRelationalMapper.aspx">Este post do Ayende</a> mostra 25 funcionalidades importantes (cache, gerenciamento de concorrência, etc) que você vai precisar quando estiver lidando com dados e que custariam muito caro (tempo e complexidade) caso você queira escreve-las “na mão”.</p>
<p>Em cenários de aplicações de internet onde o número de leituras é infinitamente superior ao número de escritas no banco de dados deve se utilizar cache no front end (IIS), portanto o tempo que se leva pra montar uma página é irrelevante. Mesmo que você carregasse os dados de um servidor remoto via conexão discada não faria diferença uma vez que os dados estivessem em cache.</p>
<p>Por último, se você se encontrar em uma situação utilizando NHibernate onde o acesso a dados é o gargalo da sua aplicação seu problema não é o NHibernate (a não ser que você tenha usado-o de maneira totalmente absurda, mas a probabilidade de você fazer o mesmo com ADO.NET é grande também). Nestes cenários o problema não é o acesso a dados em si, mas o resto da arquitetura que não escala de maneira adequada seja por meio de cache, processamento assincrono, filas, etc.</p>
<p>Sendo assim, acredito que podemos concluir que não faz sentido algum no meio do ano de 2010 utilizar queries AdHoc ou Stored Procedures em aplicações <a title="Line of Business @ Wikipedia" href="http://en.wikipedia.org/wiki/Line_of_business">LoB</a>. <img src='http://blog.tucaz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>O código completo utilizado está no GitHub e pode ser <a title="NHPerf Source Code @ GitHub" href="http://github.com/tucaz/Samples/tree/master/NHPerf/">acessado online</a> ou baixado em <a title="Download of NHPerf Source Code @ GitHub" href="http://github.com/downloads/tucaz/Samples/NHPerf.zip">formato zip</a>.</p>
<p><strong>[1] – Hidratação é o processo de preenchimento (filling) das propriedades de uma entidade</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2010/08/31/performance-nhibernate-versus-ado-net/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Lidando melhor com WCF &#8211; Ciclo de vida no cliente</title>
		<link>http://blog.tucaz.net/2010/02/23/lidando-com-wcf-ciclo-de-vida-no-cliente/</link>
		<comments>http://blog.tucaz.net/2010/02/23/lidando-com-wcf-ciclo-de-vida-no-cliente/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 17:02:31 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[channelfactory]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=415</guid>
		<description><![CDATA[Início de uma pequena série a respeito de melhores práticas no uso do WCF em .NET. Neste primeiro post falo a respeito do ChannelFactory<t> e como seu ciclo de vida deve ser gerenciado. </t>]]></description>
			<content:encoded><![CDATA[<p><strong><em>&lt;Importante&gt;</em></strong></p>
<p>Todos sabem que WCF é uma plataforma poderosa e extensível. O que muita gente não sabe é que WCF é para poucos.</p>
<p>WCF é uma plataforma que permite a construção de sistemas distribuidos e sistemas distribuidos raramente são necessários. De maneira simplificada, podemos dizer que um sistema é distribuido quando tem seus componentes instalados em mais de um computador.</p>
<p>O problema da construção de sistemas distribuídos é que devido a não centralização de seus compnentes existe um overhead de comunicação entre os computadores e serialização/deserialização de objetos e isso consome muita memória e banda de rede.</p>
<p>Como gastamos mais recursos do que necessário temos como resultado final um aumento no tempo de resposta e gasto extra de hardware que, as vezes pode ser um problema grave além é claro do aumento da complexidade técnica.</p>
<p>No entanto, não sei por qual motivo, no momento em que lançou o produto, a Microsoft esqueceu de avisar seus &#8220;consumidores&#8221; a respeito destes pequenos detalhes. Talvez porque queria promover o produto?</p>
<p><strong>&lt;/Importante&gt;</strong></p>
<p><strong>&lt;Importante 2&gt;</strong></p>
<p>WCF é uma tecnologia relativamente simples, mas apenas depois que você entende o BeABá da coisa (ou ABC<strong>[1]</strong> no caso do WCF). Até lá, qualquer coisa que fuja do point&amp;click que o Visual Studio nos oferece é relativamente complexo.</p>
<p>Portanto, sugiro que antes de aplicar WCF você procure entender um pouco mais dos fundamentos e do papel de cada objeto que ele utiliza.<strong> </strong><strong> </strong></p>
<p><strong><em>&lt;/Importante 2&gt;</em><br />
</strong></p>
<p>Agora que entendemos que não devemos usar WCF em toda aplicação que construimos (talvez isso seja tópico pra outro post?) vou falar um pouco da experiência que estou tendo com esta tecnologia e das boas práticas e atalhos que conheci.</p>
<p>Pretendo fazer uma pequena série e pra começar vou abordar boas práticas de consumo de serviços WCF, ou em outras palavras, como acessar um serviço WCF a partir de um cliente da maneira mais eficiente possível.</p>
<p>Para que seja possível consumir um serviço WCF é necessário que alguém o tenha publicado e também que tenha disponibilizado o WSDL<strong>[2]</strong> do serviço.</p>
<p>O WSDL nada mais é do que um arquivo XML que descreve quais são os tipos de dados que o serviço irá trafegar e quais operações ele oferece.</p>
<p>Geralmente, assim que temos um WSDL para consumir vamos ao Visual Studio e utilizamos a funcionalidade de <em>Add Service Reference</em> que ele nos oferece para gerar o objeto proxy que irá cuidar pra nós da comunicação com WCF. A partir dai utilizamos este objeto em toda nossa aplicação<em></em>. E este é o nosso maior erro.</p>
<p>Este proxy, gerado pelo Wizard, encapsula todas as classes necessárias para ler o WSDL, criar os tipos necessários e lidar com os canais de comunicação em cada operação que executamos. No entanto, ele o faz da <strong>pior</strong> maneira possível.</p>
<p>Cada vez que invocamos uma operação através deste proxy, ele cria uma instância da classe <a title="ChannelFactory&lt;T&gt; @ Msdn.com" href="http://msdn.microsoft.com/en-us/library/ms576132.aspx" target="_self">ChannelFactory&lt;T&gt;</a>. Esta classe é responsável por ler as configurações definidas em nosso app.config e baseado nestas configurações abrir os canais de comunicação com o serviço que iremos consumir. Este processo é <strong>muito lento</strong>, pois todos os sockets, listeners e objetos necessários da própria infra estrutura do WCF são criados e configurados neste momento.</p>
<p>No entanto, este processo não precisa ser feito a cada chamada para o serviço WCF uma vez que estas informações não mudarão enquanto a aplicação estiver rodando. Então, para otimizar bastante o consumo de serviços devemos ignorar o proxy gerado pelo Wizard e cuidar da criação e destruição de canais nós mesmos mantendo este objeto (ChannelFactory&lt;T&gt;) como <a title="Singleton @ Wikipedia.org" href="http://pt.wikipedia.org/wiki/Singleton" target="_self">Singleton</a> que irá durar pelo tempo de vida da aplicação. Dessa forma toda vez que chamamos uma operação remota não existe a necessidade de executar o setup e tear down desse objeto.</p>
<p>Para facilitar a gerência desses objetos construi uma pequena DLL que é composta apenas de uma classe. O código está disponível no <a title="Communications Manager @ GitHub" href="http://github.com/tucaz/CommunicationsManager" target="_self">github</a> e a <a title="Communications Manager @ GitHub" href="http://github.com/tucaz/CommunicationsManager/downloads" target="_self">DLL compilada está aqui</a>. A <a title="Communications Manager Docs @ GitHub" href="http://wiki.github.com/tucaz/CommunicationsManager/">documentação inicial também está lá</a>. Tudo pronto para ser usado.</p>
<p><strong>Referências adicionais (e importantes)</strong></p>
<ul>
<li><a title="Performance Improvement for WCF Client Proxy Creation in .NET 3.5 and Best Practices @ Wenlong Dong's Blog" href="http://blogs.msdn.com/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and-best-practices.aspx" target="_self">Performance improvement for WCF client proxy creation in .NET 3.5 and best practices @ Wenlong Dong&#8217;s Blog</a></li>
<li><a title="Internals - Proxy de Serviço WCF @ Israel Aece" href="http://www.israelaece.com/post/Internals-Proxy-de-servicos-WCF.aspx" target="_self">Internals &#8211; Proxy de Serviços WCF @ Israel Aece</a></li>
<li><a title="WCF Client Channel Pool - Improved Client Performance @ Glavs Blog" href="http://weblogs.asp.net/pglavich/archive/2007/05/07/wcf-client-channel-pool-improved-client-performance.aspx">WCF Client Channel Pool &#8211; Improved Client Performance @ Glavs Blog</a></li>
<li><a href="http://stackoverflow.com/questions/1825990/wcf-channelfactory-and-channel-caching-in-asp-net-client-application" target="_self">Bate papo que me levou a este componente @ StackOverflow</a></li>
</ul>
<p><strong>[1]</strong> ABC = Address, Bindings e Contracts<br />
<strong>[2]</strong> É possível consumir um serviço WCF sem acesso ao WSDL, mas este é um cenário pouco comum</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2010/02/23/lidando-com-wcf-ciclo-de-vida-no-cliente/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>(Inglês) Basic stuff: handling exceptions in .NET</title>
		<link>http://blog.tucaz.net/2009/07/21/basic-stuff-handling-exceptions-in-net/</link>
		<comments>http://blog.tucaz.net/2009/07/21/basic-stuff-handling-exceptions-in-net/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 18:19:09 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[handling]]></category>
		<category><![CDATA[vb.net]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=336</guid>
		<description><![CDATA[(Inglês) A simple guide on How to build proper exception handling in .NET.]]></description>
			<content:encoded><![CDATA[<p>Desculpe, mas este post só está disponível em <a href="http://blog.tucaz.net/en/category/desenvolvimento/c-desenvolvimento/feed/">Inglês</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2009/07/21/basic-stuff-handling-exceptions-in-net/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>.NET Scrum &#8211; Projeto Open Source</title>
		<link>http://blog.tucaz.net/2008/12/28/net-scrum-projeto-open-source/</link>
		<comments>http://blog.tucaz.net/2008/12/28/net-scrum-projeto-open-source/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 20:16:31 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[.NET Scrum]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[Codeplex]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Fluent Interfaces]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[NHibernate]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Spring.NET]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=195</guid>
		<description><![CDATA[Projeto .NET open source para gerenciamente de projetos utilizando Scrum como disciplina. Boas práticas de engenharia e conducação de projetos utilizando frameworks e práticas de mercado.]]></description>
			<content:encoded><![CDATA[<p>Há poucas semanas, batendo papo com o pessoal do <a title="DotNetArchitects - Arquitetura em .NET" href="http://www.dotnetarchitects.net/" target="_self">DotNetArchitects</a>, surgiu a idéia de utilizarmos uma ferramenta de gerenciamento de projetos Scrum pra cuidar dos das nossas atividades dentro do grupo.</p>
<p>Fui pesquisar, mas não encontrei nenhuma ferramenta gratuita web que pudessemos usar. Foi ai que surgiu o <a title=".NET Scrum - Ferramenta open source de gerenciamento de projetos Scrum" href="https://www.codeplex.com/netscrum" target="_self"><strong>.NET Scrum</strong></a>. A idéia não é construir nada pra competir com o que existe por ai, mas utilizar da idéia pra ter um laboratório e construir um projeto onde possamos aplicar o que há de mais novo em tecnologia além de boas práticas de engenharia e condução de projetos.</p>
<p>Portanto, quem der uma olhada no projeto e quiser contribuir ou apenas acompanhar vai encontrar um ASP.NET MVC, jQuery, NHibernate usando interfaces fluentes, DDD, TDD, Spring.NET e outros frameworks e design patterns importantes para a construção de uma boa solução em .NET.</p>
<p>Se deixarmos de lado a parte tecnológica também é possível aprender um bocado trabalhando na organização de um projeto open source. Projetos de código aberto e mantidos pela comunidade são o maior caso de sucesso de times distribuidos trabalhando juntos a fim de atingir um objetivo. Se já é difícil obter sucesso em um projeto com o time no mesmo lugar, imagine trabalhar com pessoas que você nunca viu na vida e com comunicação relativamente limitada? Um grande desafio!</p>
<p>O <a title="Mauricio Aniche - Blog" href="http://aniche.com.br/blog/" target="_self">Maurício Aniche</a> que participa do DotNetArchitects já se juntou ao projeto pra me ajudar. Já existem alguns códigos publicados no codeplex e uma documentação miníma também. Quem quiser ajudar é mais do que bem vindo! <img src='http://blog.tucaz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/12/28/net-scrum-projeto-open-source/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>.NET Framework 4 Universe e paralelismo com LINQ</title>
		<link>http://blog.tucaz.net/2008/12/03/net-framework-4-universe-e-paralelismo-com-linq/</link>
		<comments>http://blog.tucaz.net/2008/12/03/net-framework-4-universe-e-paralelismo-com-linq/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 12:21:48 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET Framework 4.0]]></category>
		<category><![CDATA[FX4.0]]></category>
		<category><![CDATA[Parallel Computing]]></category>
		<category><![CDATA[Parallel Linq]]></category>
		<category><![CDATA[PLINQ]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=178</guid>
		<description><![CDATA[Informações a respeito de computação paralela (PLINQ) utilizando framework 4.0.]]></description>
			<content:encoded><![CDATA[<p>Navegando nos links da microsoft, buscando a respeito de algumas features novas que vão estar disponíveis a partir do .net framework 4.0 encontrei duas coisas especialmente interessantes que merecem ser comentadas e linkadas.</p>
<p>Na edição deste ano do <acronym title="Professional Developers Conference">PDC</acronym> foi entregue aos participantes um poster gigante com as novidades que devem vir para próxima versão do framework que deve sair ano que vem. O poster pode ser baixado por este link no blog do <a title=".NET Framework 4.0 Universe" href="http://blogs.msdn.com/brada/archive/2008/10/29/net-framework-4-poster.aspx" target="_blank">Brad Adams</a>. Existe também uma versão estilo google maps onde você pode dar zoom e visualizar no browser com mais facilidade do que o faria em uma imagem gigante.</p>
<p>Antes de chegar a este link do poster assisti um <a title="Webcast - Parallel LINQ " href="mms://wm.microsoft.com/ms/uk/msdn/nuggets/PFX_PLINQ_Moth.wmv" target="_blank">webcast</a> muito legal feito pelo Daniel Moth (Microsoft UK Developer) a respeito de paralelismo em queries LINQ. Hoje, quando rodamos software feito em .NET em em hardware multi-processado não conseguimos obter todo o benefício da utilização de multi processamento.</p>
<p>Com Parallel LINQ (ou PLINQ para facilitar) será possível tirar vantagem de todas as CPUs disponíveis no equipamento para diminuir drasticamente o tempo de processamento. Na demo feita pelo Daniel o ganho ficou em torno de 50%. A melhor parte disto é que quase nenhum código é necessário para obter essas melhorias. Se você ainda não viu nada a respeito de Paralelismo vale a pena dar uma conferida no vídeo.</p>
<p>Vou deixar também aqui alguns outros links complementares que eu peguei <a title="Computação de alto desempenho - Por Carlos Hulot" href="http://blogs.msdn.com/hulot/archive/2008/09/02/computa-o-de-alto-desempenho-hpc-e-paralelismo.aspx" target="_blank">deste post no blog do Carlos Hulot</a>:</p>
<p><a title="PFX Samples" href="mms://wm.microsoft.com/ms/uk/msdn/nuggets/PFX_TourOfSamples_Moth.wmv" target="_blank">mms://wm.microsoft.com/ms/uk/msdn/nuggets/PFX_TourOfSamples_Moth.wmv</a> &#8211; MMS Vídeo<a title="PFX Samples" href="mms://wm.microsoft.com/ms/uk/msdn/nuggets/PFX_TourOfSamples_Moth.wmv" target="_blank"><br />
</a></p>
<p><a title="Understanding Parallel Classes" href="mms://wm.microsoft.com/ms/uk/msdn/nuggets/PFX_ParallelClass_Moth.wmv" target="_blank">mms://wm.microsoft.com/ms/uk/msdn/nuggets/PFX_ParallelClass_Moth.wmv</a> &#8211; MMS Vídeo</p>
<p>Mais referências oficiais:</p>
<p><a title="Página oficial Microsoft sobre computação paralela" href="http://msdn.microsoft.com/en-us/concurrency/default.aspx" target="_blank">http://msdn.microsoft.com/en-us/concurrency/default.aspx</a> &#8211; Página oficial Microsoft sobre computação paralela</p>
<p><a title="Blog do time de desenvolvimento de Paralelismo" href="http://blogs.msdn.com/pfxteam/" target="_blank">http://blogs.msdn.com/pfxteam/</a> &#8211; Blog do time de desenvolvimento de Paralelismo</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/12/03/net-framework-4-universe-e-paralelismo-com-linq/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nem tudo é relacional</title>
		<link>http://blog.tucaz.net/2008/10/01/nem-tudo-e-relacional/</link>
		<comments>http://blog.tucaz.net/2008/10/01/nem-tudo-e-relacional/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 00:47:08 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[BinaryFormatter]]></category>
		<category><![CDATA[Modelo Relacional]]></category>
		<category><![CDATA[Serialized LOB]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=89</guid>
		<description><![CDATA[Esses dias me peguei pensando em um costume interessante que temos. Quando digo &#8220;nós&#8221;, falo de min e das pessoas com as quais já trabalhei nesses 4 anos que atuo com .NET. Fomos acostumados, em se tratando de persistência em banco de dados, de sempre utilizar modelo relacional pra qualquer tipo de armazenamento de objeto. [...]]]></description>
			<content:encoded><![CDATA[<p>Esses dias me peguei pensando em um costume interessante que temos. Quando digo &#8220;nós&#8221;, falo de min e das pessoas com as quais já trabalhei nesses 4 anos que atuo com .NET. Fomos acostumados, em se tratando de persistência em banco de dados, de sempre utilizar modelo relacional pra qualquer tipo de armazenamento de objeto. O problema é que nem sempre isso é necessário e acabamos perdendo ou tempo em codificação ou desempenho ou espaço em disco.</p>
<p>A idéia de banco de dados orientado a objetos sempre me agradou e acho uma pena não ter chegado ao mainstream. No entanto o conceito de armazenar o grafo todo de objetos é muito interessante em algumas situações. Vou usar um exemplo que talvez não seja o melhor, mas deve passar a idéia.</p>
<p>Imagine um cadastro de cliente com diversas entidades relacionadas: diversos endereços, vários telefones para contato, dependentes, etc.</p>
<div id="attachment_90" class="wp-caption aligncenter" style="width: 510px"><a href="http://blog.tucaz.net/wp-content/uploads/2008/10/relacional01.jpg"><img class="size-full wp-image-90" style="border: 1px solid black;" title="Modelo de Classes" src="http://blog.tucaz.net/wp-content/uploads/2008/10/relacional01.jpg" alt="Modelo de Classes" width="500" height="173" /></a><p class="wp-caption-text">Modelo de Classes</p></div>
<p>Normalmente criaríamos uma tabela para cada uma das entidades e essas tabelas teriam uma referência (FK) para a tabela principal de clientes:</p>
<div id="attachment_91" class="wp-caption aligncenter" style="width: 352px"><a href="http://blog.tucaz.net/wp-content/uploads/2008/10/relacional02.jpg"><img class="size-full wp-image-91" style="border: 1px solid black;" title="Modelo de Dados normalizado" src="http://blog.tucaz.net/wp-content/uploads/2008/10/relacional02.jpg" alt="Modelo de Dados normalizado" width="342" height="261" /></a><p class="wp-caption-text">Modelo de Dados normalizado</p></div>
<p>Se considerássemos que um endereço ou automóvel pudesse pertencer a mais de um cliente a coisa ficaria ainda mais complicada e teríamos que criar tabelas de relacionamento N:M.</p>
<p>Para que o exemplo seja útil, vamos considerar que nesse sistema não fosse possível efetuar pesquisas utilizando como filtro nenhuma dessas entidades (em um sistema real é óbvio que requisito é um absurdo) e só seria disponibilizada uma funcionalidade de busca por meio de código (id). Mesmo com esse requisito, como pensamos sempre em de forma relacional o caminho natural seria criar o modelo de dados acima e armazenar tudo bastante normalizado.</p>
<p>No entanto existe outra opção que em determinados casos é muito interessante. Guardar o objeto inteiro no banco.</p>
<p>Em .NET, por exemplo, bastaria criar um modelo simples de dados contendo o idCliente e um campo que armazene binário (varbinary em SQL), serializar o objeto e pronto.</p>
<div id="attachment_92" class="wp-caption aligncenter" style="width: 112px"><a href="http://blog.tucaz.net/wp-content/uploads/2008/10/relacional03.jpg"><img class="size-full wp-image-92" style="border: 1px solid black;" title="Modelo de dados mais simples" src="http://blog.tucaz.net/wp-content/uploads/2008/10/relacional03.jpg" alt="Modelo de dados mais simples" width="102" height="78" /></a><p class="wp-caption-text">Modelo de dados mais simples</p></div>
<p>public Cliente Consultar(int codigoCliente)<br />
{<br />
//Recupera do DB<br />
byte[] clienteSerializado = DaoCliente.ConsultarPorCodigo(codigoCliente);<br />
//Devolve o objeto deserializado<br />
return this.DeserializarObjeto&lt;Cliente&gt;(clienteSerializado);<br />
}</p>
<p>public void Salvar(Cliente novoCliente)<br />
{<br />
//Serializa o objeto<br />
byte[] clienteSerializado = this.SerializarObjeto&lt;Cliente&gt;(novoCliente);<br />
//Guarda o cliente no DB<br />
DaoCliente.Inserir(novoCliente.Codigo, clienteSerializado);<br />
}</p>
<p>private byte[] SerializarObjeto&lt;T&gt;(T objeto)<br />
{<br />
MemoryStream ms = new MemoryStream();<br />
BinaryFormatter formatter = new BinaryFormatter();<br />
formatter.Serialize(ms, objeto);<br />
byte[] objetoSerializado = ms.ToArray();<br />
ms.Close();<br />
return objetoSerializado;<br />
}</p>
<p>private T DeserializarObjeto&lt;T&gt;(byte[] objetoSerializado)<br />
{<br />
MemoryStream ms = new MemoryStream();<br />
BinaryFormatter formatter = new BinaryFormatter();<br />
ms.Write(objetoSerializado, 0, objetoSerializado.Length);<br />
ms.Position = 0;<br />
return (T)formatter.Deserialize(ms);<br />
}</p>
<p>Dessa maneira, sempre que precisarmos, já iremos ter o objeto completo e não seria necessário executar diversas instruções SQL ou stored procedures e muitas chamadas ao banco. Iriamos apenas executar uma chamada que nos retornaria o objeto completo e pronto para uso.</p>
<p>Essa é uma solução diferente e que pode ser útil em alguns cenários, principalmente se você não utiliza nenhum framework ORM. Contudo, é importante verificar todos os requisitos com bastante cuidado, com essa solução corremos o risco de ficar com dados desatualizados e perdemos a possibilidade de efetuar buscas por campos que estejam dentro dos objetos armazenados.</p>
<p>Acho muito legal encontrarmos formas diferentes de fazer as mesmas coisas que estamos habituados. É uma maneira muito eficiente de aprendizado e conhecimento das nossas ferramentas.</p>
<p>O que você acha?</p>
<p><strong>Editado:</strong> sem saber, acabei descrevendo o pattern Serialized Lob já catalogo pelo Fowler em seu livro PoEAA. O Bruno achou e comentou o post colocando <a href="http://martinfowler.com/eaaCatalog/serializedLOB.html" target="_blank">este link</a>. Valeu! <img src='http://blog.tucaz.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/10/01/nem-tudo-e-relacional/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Novo Microsoft Architecture Guide lançado</title>
		<link>http://blog.tucaz.net/2008/09/24/novo-microsoft-architecture-guide-lancado/</link>
		<comments>http://blog.tucaz.net/2008/09/24/novo-microsoft-architecture-guide-lancado/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 13:49:12 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Architecture Guide]]></category>
		<category><![CDATA[Arquitetura de Referência]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=87</guid>
		<description><![CDATA[Lá atrás, em 2002, a Microsoft lançou a primeira versão da sua arquitetura de referência para os cenários mais comuns de aplicações corporativas.
Esse é um documento, que apesar de antigo, é bastante interessante e ainda atual na maioria dos aspectos. Eu descobri esse documento cerca de uns 1 ano e meio atrás quando procurava melhores [...]]]></description>
			<content:encoded><![CDATA[<p>Lá atrás, em 2002, a Microsoft lançou a <a href="http://msdn.microsoft.com/en-us/library/ms978348.aspx" target="_blank">primeira versão</a> da sua arquitetura de referência para os cenários mais comuns de aplicações corporativas.</p>
<p>Esse é um documento, que apesar de antigo, é bastante interessante e ainda atual na maioria dos aspectos. Eu descobri esse documento cerca de uns 1 ano e meio atrás quando procurava melhores práticas para aplicar no primeiro sistema pelo qual eu seria responsável.</p>
<p>Sempre achei uma pena o fato de eles não manterem esse documento atualizado. Talvez isso acontecesse, pois é sempre complicado falar a respeito de arquiteturas de referência já que cada caso é um caso.</p>
<p>No entanto, pra nossa felicidade, eles lançaram uma nova versão esse mês e está disponível através <a href="http://www.codeplex.com/AppArch/Wiki/View.aspx?title=Guidelines&amp;referringTitle=Home" target="_blank">deste link</a> no Codeplex.</p>
<p>O documento apresenta quais decisões tomar e porque toma-las em uma série de cenários. Desde aplicações desktop até aplicações web com SOA e RIA.</p>
<p>Ainda não tive tempo de ir a fundo no documento, mas parece estar bastante atualizado.</p>
<p>Há algum tempo atrás, eu procurava saber porque raios alguém construiria uma aplicação utilizando WCF/Remoting/Web Services se essa aplicação não teria seus componentes de negócio reutilizados. Nunca entendi isso e achava um absurdo a Microsoft não disponibilizar nenhum &#8220;guia&#8221; (eu nunca achei, pelo menos) que dissesse quando devo distribuir as camadas de uma aplicação fisicamente e quando não. Infelizmente algumas coisas nós acabamos aprendendo só depois de aplicar e apanhar um pouco.</p>
<p>Nesse documento, pelo menos <a href="http://www.codeplex.com/AppArch/Wiki/View.aspx?title=Web%20Application%20Archetype&amp;referringTitle=Application%20Types" target="_self">este ponto a Microsoft esclareceu</a> e isso já é suficiente pra me deixar bastante feliz.</p>
<p>Esse documento não vai evitar que nós, desenvolvedores, cometamos erros, mas acredito que é muito importante os fornecedores de plataformas e tecnologias grandes como .NET se pronunciarem e fornecerem guias, mesmo que simples e com uma visão bem macro, para que as pessoas não fiquem perdidas e cometam erros demais em seus sistemas.</p>
<p>Ponto pra Microsoft.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/09/24/novo-microsoft-architecture-guide-lancado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DDD no Entity Framework</title>
		<link>http://blog.tucaz.net/2008/09/11/ddd-no-entity-framework/</link>
		<comments>http://blog.tucaz.net/2008/09/11/ddd-no-entity-framework/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 05:15:18 +0000</pubDate>
		<dc:creator>tucaz</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[EF]]></category>
		<category><![CDATA[PI]]></category>
		<category><![CDATA[POCO]]></category>

		<guid isPermaLink="false">http://blog.tucaz.net/?p=82</guid>
		<description><![CDATA[Essa informação é não a mais nova do mundo (saiu há 3 meses atrás), mas da mesma maneira que passou desapercebido pra min e pro Giovanni Bassi (que foi onde eu vi hoje), pode ter passado pra muita gente e eu acho mais do que legítimo divulgar.
Depois do oba-oba que a comunidade fez contra o [...]]]></description>
			<content:encoded><![CDATA[<p>Essa informação é não a mais nova do mundo (saiu há 3 meses atrás), mas da mesma maneira que passou desapercebido pra min e pro <a href="http://unplugged.giggio.net/unplugged/post/Microsoft-de-olho-em-Domain-Driven-Design.aspx" target="_blank">Giovanni Bassi</a> (que foi onde eu vi hoje), pode ter passado pra muita gente e eu acho mais do que legítimo divulgar.</p>
<p>Depois do <a href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/" target="_blank">oba-oba</a> que a comunidade fez contra o Entity Framework que acabou saindo meio mal acabado e ainda totalmente focado em banco de dados sem suporte a PI para POCOs no SP1 a Microsoft finalmente deu uma dentro.</p>
<p>Eles convidaram Eric Evans (criador do domain-driven design), Martin Fowler (não preciso dizer quem é, né?), Jimmy Nilsson (praticante de DDD com .NET que escreveu um <a href="http://blog.tucaz.net/2008/08/15/applying-domain-driven-design-and-patterns-resenha/" target="_blank">ótimo livro</a>), Stephen Forte e Pavel Hruby para formar um conselho com o objetivo de palpitar a respeito de como o Entity Framework deveria ser remodelado.</p>
<p>Com esse pessoal todo envolvido e mais algumas coisas que o pessoal anda soltando no <a href="http://blogs.msdn.com/efdesign/default.aspx" target="_blank">blog do EF</a>, boto fé que vem coisa boa ai pela frente!</p>
<p>A &#8220;notícia&#8221; pode ser vista com mais detalhes neste <a href="http://blogs.msdn.com/dsimmons/archive/2008/06/03/dp-advisory-council.aspx" target="_blank">link</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tucaz.net/2008/09/11/ddd-no-entity-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

