<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><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" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>FD Web</title>
	
	<link>http://fdweb.com.br</link>
	<description />
	<lastBuildDate>Mon, 05 Jan 2009 19:02:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/fdweb" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Implemente cache nas aplicações .NET com o Caching Application Block</title>
		<link>http://feedproxy.google.com/~r/fdweb/~3/uwl0hpfMk9w/</link>
		<comments>http://fdweb.com.br/implemente-cache-nas-aplicaes-net-com-o-caching-application-block/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 17:33:28 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[block]]></category>
		<category><![CDATA[cab]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[caching]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=97</guid>
		<description><![CDATA[Introdu&#231;&#227;o
O Caching Application Block (CAB) &#233; um dos Application Blocks que constituem a Enterprise Library. Caso voc&#234; n&#227;o conhe&#231;a a Enterprise Library leia o artigo Enterprise Library e os Application Blocks. O CAB &#233; uma biblioteca simples que permite tornas as aplica&#231;&#245;es mais escal&#225;veis e robustas. Ao colocar em cache informa&#231;&#245;es que s&#227;o frequentemente acessadas, [...]<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/implemente-cache-nas-aplicaes-net-com-o-caching-application-block/">Implemente cache nas aplica&ccedil;&otilde;es .NET com o Caching Application Block</a></p>
]]></description>
			<content:encoded><![CDATA[<h3>Introdu&ccedil;&atilde;o</h3>
<p>O Caching Application Block (CAB) &eacute; um dos Application Blocks que constituem a Enterprise Library. Caso voc&ecirc; n&atilde;o conhe&ccedil;a a Enterprise Library leia o artigo <a href="http://fdweb.com.br/microsoft-enterprise-library-41-microsoft-application-blocks/">Enterprise Library e os Application Blocks</a>. O CAB &eacute; uma biblioteca simples que permite tornas as aplica&ccedil;&otilde;es mais escal&aacute;veis e robustas. Ao colocar em cache informa&ccedil;&otilde;es que s&atilde;o frequentemente acessadas, evitamos o acesso a bancos de dados, webservices ou outro servi&ccedil;o qualquer.</p>
<h3>Mas por que evitar acesso a banco de dados?</h3>
<p>Quando guardamos informa&ccedil;&otilde;es em cache os dados ficam armazenados em mem&oacute;ria. Todo e qualquer acesso feito &agrave; mem&oacute;ria &eacute; in&uacute;meras vezes mais r&aacute;pido do que executar uma consulta a um banco de dados e retornar as informa&ccedil;&otilde;es. Imagine que temos uma lista de estado civil, por exemplo. Esta lista dificilmente ter&aacute; os seus dados alterados. Desta forma, seria desnecess&aacute;rios buscar no banco de dados essas informa&ccedil;&otilde;es toda vez que o sistema precise exibi-las na tela. Esta lista poderia facilmente ser colocada em cache, ou seja, armazenada em mem&oacute;ria. A rela&ccedil;&atilde;o de custo-benef&iacute;cio entre o gasto de mem&oacute;ria ao tempo de resposta da consulta ao banco de dados ser&aacute; gritante. Imagine, ent&atilde;o, se ao inv&eacute;s de um banco de dados estejamos acessando um webservice ou outro servi&ccedil;o externo. O ganho de velocidade compensa qualquer gasto adicional de mem&oacute;ria.</p>
<h3>CONFIGURANDO O CAB</h3>
<p>Vamos ver ent&atilde;o como implementar o cache em uma aplica&ccedil;&atilde;o. Antes de mais nada devemos adicionar a refer&ecirc;ncia ao CAB ao projeto:</p>
<p><img src="http://img149.imageshack.us/img149/9561/addreferenceft4.jpg" alt="" /></p>
<p>Feito isso, devemos, ent&atilde;o, adicionar ao arquivo de configura&ccedil;&atilde;o (web.config, app.config) os dados referentes ao CAB:</p>
<pre class="brush: xml;">
&lt;configuration&gt;
&lt;configSections&gt;
&lt;section  name=&quot;cachingConfiguration&quot;  type=&quot;Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings,  Microsoft.Practices.EnterpriseLibrary.Caching, Version=3.1.0.0, Culture=neutral,  PublicKeyToken=b03f5f7f11d50a3a&quot; /&gt;
&lt;/configSections&gt;
&lt;cachingConfiguration defaultCacheManager=&quot;TesteCache&quot;&gt;
&lt;cacheManagers&gt;
&lt;add  expirationPollFrequencyInSeconds=&quot;60&quot;  maximumElementsInCacheBeforeScavenging=&quot;1000&quot;
numberToRemoveWhenScavenging=&quot;10&quot; backingStoreName=&quot;Null  Storage&quot;
name=&quot;TesteCache&quot; /&gt;
&lt;/cacheManagers&gt;
&lt;backingStores&gt;
&lt;add  encryptionProviderName=&quot;&quot;  type=&quot;Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore,  Microsoft.Practices.EnterpriseLibrary.Caching, Version=3.1.0.0, Culture=neutral,  PublicKeyToken=b03f5f7f11d50a3a&quot;
name=&quot;Null Storage&quot;  /&gt;
&lt;/backingStores&gt;
&lt;/cachingConfiguration&gt;

&lt;/configuration&gt;
</pre>
<p>Note que <strong>TesteCache </strong>&eacute; o identificador da configura&ccedil;&atilde;o do cache. Este &eacute; o nome que deveremos referenciar na aplica&ccedil;&atilde;o para que o cache funcione corretamente. Este nome pode ser alterado sem problema algum.</p>
<h3>Implementando o CAB</h3>
<p>Devemos incluir na se&ccedil;&atilde;o de <em>using</em> o namespace utilizado pelo CAB:</p>
<p>using Microsoft.Practices.EnterpriseLibrary.Caching;</p>
<p>Em seguida devemos criar o objeto que armazenar&aacute; os dados em mem&oacute;ria, ou seja, o objeto gerenciador do cache:</p>
<p>private CacheManager _cache = CacheFactory.GetCacheManager(&#8221;TesteCache&#8221;);</p>
<p><strong>Adicionando dados ao cache</strong></p>
<p>Adicionar dados ao cache &eacute; bastante simples, basta chamar o m&eacute;todo <em>Add</em>:</p>
<p>cache.Add(&#8221;nome&#8221;, &#8220;Fabio&#8221;);</p>
<p>Onde <strong>nome</strong> &eacute; o identificador da informa&ccedil;&atilde;o no cache e <strong>Fabio</strong> &eacute; a informa&ccedil;&atilde;o propriamente dita. Qualquer objeto pode ser armazenado em cache.</p>
<p>&Eacute; bom lembrar que o m&eacute;todo <em>Add</em> tamb&eacute;m &eacute; utilizado para alterar os dados salvos no cache. Por exemplo:</p>
<p>cache.Add(&#8221;nome&#8221;, &#8220;Fabio&#8221;);<br />
cache.Add(&#8221;nome&#8221;, &#8220;Daniel&#8221;);</p>
<p>Ao recuperar do cache o ind&iacute;ce <em>nome</em>, o valor retornado ser&aacute; sempre o &uacute;ltimo informado, no caso, &#8220;Daniel&#8221;. Como o identificador &eacute; &uacute;nico, n&atilde;o &eacute; poss&iacute;vel ter uma lista de objetos com o mesmo identificador, mas pode-se guardar uma lista de objetos:</p>
<p>List lista = new List();</p>
<p>lista.Add(1);<br />
lista.Add(2);<br />
lista.Add(3);</p>
<p>cache.Add(&#8221;lista&#8221;, lista);</p>
<p><strong>Recuperando dados do cache</strong></p>
<p>Obter os dados do cache tamb&eacute;m &eacute; simples, basta chamar o m&eacute;todo <em>GetData</em> passando como par&acirc;metro o identificador:</p>
<p>string Nome = cache.GetData(&#8221;nome&#8221;).ToString();<br />
List novaLista = (List)cache.GetData(&#8221;lista&#8221;);</p>
<p><strong>Remover dados do cache</strong></p>
<p>Para remover informa&ccedil;&otilde;es do cache, devemos chamar o m&eacute;todo <em>Remove</em>, passando como par&acirc;metro o identificador:</p>
<p>cache.Remove(&#8221;nome&#8221;);</p>
<h3>Concluindo</h3>
<p>Com o CAB &eacute; poss&iacute;vel implementar recursos de cache de uma forma simples e r&aacute;pida.<br />
<h3>Leia tamb&eacute;m</h3>
<ul class="related_post">
<li><a href="http://fdweb.com.br/microsoft-enterprise-library-41-microsoft-application-blocks/" title="Microsoft Enterprise Library 4.1 &#8211; Microsoft Application Blocks">Microsoft Enterprise Library 4.1 &#8211; Microsoft Application Blocks (1)</a></li>
</ul>
<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/implemente-cache-nas-aplicaes-net-com-o-caching-application-block/">Implemente cache nas aplica&ccedil;&otilde;es .NET com o Caching Application Block</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/implemente-cache-nas-aplicaes-net-com-o-caching-application-block/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://fdweb.com.br/implemente-cache-nas-aplicaes-net-com-o-caching-application-block/</feedburner:origLink></item>
		<item>
		<title>Microsoft Enterprise Library 4.1 – Microsoft Application Blocks</title>
		<link>http://feedproxy.google.com/~r/fdweb/~3/LbnRgDzgeuY/</link>
		<comments>http://fdweb.com.br/microsoft-enterprise-library-41-microsoft-application-blocks/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 19:37:00 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[blocks]]></category>
		<category><![CDATA[enterprise]]></category>
		<category><![CDATA[library]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/microsoft-enterprise-library-41-microsoft-application-blocks/</guid>
		<description><![CDATA[O Microsoft Enterprise Library re&#250;ne uma s&#233;rie de &#8220;blocos&#8221; de componentes chamados Application Blocks. Os Application Blocks s&#227;o componentes reutiliz&#225;veis criados para auxiliar no desenvolvimento de software utilizando as melhores pr&#225;ticas recomendadas pela Microsoft. Al&#233;m de serem gratuitos, estes blocos podem ser utilizados tanto em sistemas de grande porte, como em sistemas pequenos, ajudando a [...]<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/microsoft-enterprise-library-41-microsoft-application-blocks/">Microsoft Enterprise Library 4.1 &#8211; Microsoft Application Blocks</a></p>
]]></description>
			<content:encoded><![CDATA[<p>O Microsoft Enterprise Library re&uacute;ne uma s&eacute;rie de &#8220;blocos&#8221; de componentes chamados Application Blocks. Os Application Blocks s&atilde;o componentes reutiliz&aacute;veis criados para auxiliar no desenvolvimento de software utilizando as melhores pr&aacute;ticas recomendadas pela Microsoft. Al&eacute;m de serem gratuitos, estes blocos podem ser utilizados tanto em sistemas de grande porte, como em sistemas pequenos, ajudando a padronizar e facilitar a vida do desenvolvedor.</p>
<p>Os objetivos dos application blocks s&atilde;o:</p>
<p><strong>Consist&ecirc;ncia -</strong> Todos os Application Blocks seguem boas pr&aacute;ticas e implementa&ccedil;&otilde;es com qualidade. Al&eacute;m disso, s&atilde;o disponibilizados at&eacute; mesmo os testes unit&aacute;rios elaborados pelo time de desenvolvimento.</p>
<p><strong>Extensibilidade -</strong> Todos os Applications Blocks s&atilde;o desenvolvidos de tal forma que uma poss&iacute;vel customiza&ccedil;&atilde;o para uma necessidade especifica, seja facilmente customiz&aacute;vel.</p>
<p><strong>F&aacute;cil de usar -</strong> S&atilde;o muitos recursos prontos em que uma &uacute;nica linha de chamada, ou somente uma altera&ccedil;&atilde;o em um arquivo de configura&ccedil;&atilde;o e o recurso j&aacute; est&aacute; implementado.</p>
<p><strong>Integra&ccedil;&atilde;o -</strong> Todos os Applications Blocks podem trabalhar de forma integrada ou podemos tamb&eacute;m trabalhar somente com um dos blocos.</p>
<h2>Os Application blocks</h2>
<p>A vers&atilde;o 4.1 (Outubro 2008) traz os seguintes blocos:</p>
<p><strong><a title="Caching Application Block" href="http://fdweb.com.br/implemente-cache-nas-aplicaes-net-com-o-caching-application-block/" target="_blank">Caching Application Block</a>:</strong> Com este componente &eacute; poss&iacute;vel implementar funcionalidades de cache local nas aplica&ccedil;&otilde;es</p>
<p><strong>Cryptography Application Block:</strong> Este componente permite implementar <em>hashing</em> e encripta&ccedil;&atilde;o sim&eacute;trica nas aplica&ccedil;&otilde;es.</p>
<p><strong>Data Access Application Block:</strong> Este componente permite padrozinar e agilizar a forma como os dados s&atilde;o acessados.</p>
<p><strong>Exception Handling Application Block:</strong> Com este componente &eacute; poss&iacute;vel implementar pol&iacute;ticas de tratamento de erros de forma f&aacute;cil e configur&aacute;vel.</p>
<p><strong>Logging Application Block:</strong> Permite implementar t&eacute;cnicas de <em>log</em> padr&atilde;o nas aplica&ccedil;&otilde;es.</p>
<p><strong>Policy Injection Application Block:</strong> Permite aplicar regras a inst&acirc;ncias de classes em tempo de execu&ccedil;&atilde;o baseado em regras configur&aacute;veis.</p>
<p><strong>Security Application Block:</strong> Permite implementar funcionalidades de seguran&ccedil;a e autoriza&ccedil;&atilde;o.</p>
<p><strong>Unity Application Block</strong>: &Eacute; um pequeno e extens&iacute;vel conteiner de inje&ccedil;&atilde;o de dependencia com suporte &agrave; inje&ccedil;&atilde;o por meio de construtor, propriedade e m&eacute;todos.</p>
<p><strong>Validation Application Block</strong>. Este componente permite que os desenvolvedores criem regras de valida&ccedil;&atilde;o para objetos de neg&oacute;cio que podem ser usadas por diferentes camadas das aplica&ccedil;&otilde;es.</p>
<h2>Fazendo o download</h2>
<p>Download do Enterprise Library 4.1: <a title="Download do Enterprise Library 4.1 - Outubro 2008" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=1643758B-2986-47F7-B529-3E41584B6CE5&amp;displaylang=en" target="_blank">download</a><br />
<h3>Leia tamb&eacute;m</h3>
<ul class="related_post">
<li><a href="http://fdweb.com.br/implemente-cache-nas-aplicaes-net-com-o-caching-application-block/" title="Implemente cache nas aplica&ccedil;&otilde;es .NET com o Caching Application Block">Implemente cache nas aplica&ccedil;&otilde;es .NET com o Caching Application Block (2)</a></li>
</ul>
<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/microsoft-enterprise-library-41-microsoft-application-blocks/">Microsoft Enterprise Library 4.1 &#8211; Microsoft Application Blocks</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/microsoft-enterprise-library-41-microsoft-application-blocks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://fdweb.com.br/microsoft-enterprise-library-41-microsoft-application-blocks/</feedburner:origLink></item>
		<item>
		<title>Visual Studio 2008 Express Edition</title>
		<link>http://feedproxy.google.com/~r/fdweb/~3/wOxxNeqP5w8/</link>
		<comments>http://fdweb.com.br/visual-studio-2008-express-edition/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 15:00:43 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[studio]]></category>
		<category><![CDATA[visual]]></category>
		<category><![CDATA[vs2008]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=66</guid>
		<description><![CDATA[As vers&#245;es Express s&#227;o vers&#245;es gratuitas e com alguns recursos limitados do Visual Studio 2008. Na maioria dos casos, as vers&#245;es Express atendem totalmente &#224;s necessidades dos programadores e pequenas empresas, deixando muito pouco a desejar em rela&#231;&#227;o a vers&#227;o completa do Visual Studio. Alguns dos recursos n&#227;o inclu&#237;dos na vers&#227;o Express s&#227;o projetos de [...]<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/visual-studio-2008-express-edition/">Visual Studio 2008 Express Edition</a></p>
]]></description>
			<content:encoded><![CDATA[<p>As vers&otilde;es Express s&atilde;o vers&otilde;es gratuitas e com alguns recursos limitados do Visual Studio 2008. Na maioria dos casos, as vers&otilde;es Express atendem totalmente &agrave;s necessidades dos programadores e pequenas empresas, deixando muito pouco a desejar em rela&ccedil;&atilde;o a vers&atilde;o completa do Visual Studio. Alguns dos recursos n&atilde;o inclu&iacute;dos na vers&atilde;o Express s&atilde;o projetos de teste unit&aacute;rios, ferramenta para cria&ccedil;&atilde;o de relat&oacute;rio como o Crystal Reports, solution folders. Outra diferen&ccedil;a &eacute; que para cada linguagem existe uma ferramenta separada, assim como para web. Dessa forma, temos as seguintes ferramentas:</p>
<ul>
<li> <a href="http://www.microsoft.com/express/vb/default.aspx" target="_blank">Visual Basic 2008 Express Edition</a></li>
<li><a href="http://www.microsoft.com/express/vcsharp/" target="_blank">Visual C# 2008 Express Edition</a></li>
<li><a href="http://www.microsoft.com/express/vc/" target="_blank">Visual Web Developer Express Edition</a></li>
<li><a href="http://www.microsoft.com/express/vwd/" target="_blank">Visual C++ Express Edition</a></li>
<li><a href="http://www.microsoft.com/express/sql/default.aspx" target="_blank">SQL Server 2005 Express Edition</a></li>
</ul>
<p>&Eacute; poss&iacute;vel tamb&eacute;m fazer o download de uma imagem ISO com todas as ferramentas em um mesmo pacote, para instala&ccedil;&otilde;es offline. Para seguir o link para <a href="http://www.microsoft.com/express/download/offline.aspx">Instala&ccedil;&atilde;o Offline do Visual Studio Express Edition</a>.</p>
<p>Tamb&eacute;m &eacute; necess&aacute;rio efetuar o registro de cada uma das ferramentas. A boa not&iacute;cia &eacute; que o registro &eacute; gratuito.<br />
<h3>Leia tamb&eacute;m</h3>
<ul class="related_post">
<li><a href="http://fdweb.com.br/acessando-banco-de-dados-usando-php-e-adodb/" title="Acessando banco de dados usando PHP e ADODB">Acessando banco de dados usando PHP e ADODB (6)</a></li>
<li><a href="http://fdweb.com.br/easytext-componente-textbox-com-recursos-adicionais/" title="EasyText: Componente TextBox com recursos adicionais">EasyText: Componente TextBox com recursos adicionais (0)</a></li>
<li><a href="http://fdweb.com.br/trabalhando-com-a-taskbar-do-windows-no-visual-basic/" title="Trabalhando com a taskbar do windows no Visual Basic">Trabalhando com a taskbar do windows no Visual Basic (2)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/" title="Novidades do C# 3.0: Implicitly Typed Local Variables">Novidades do C# 3.0: Implicitly Typed Local Variables (1)</a></li>
<li><a href="http://fdweb.com.br/implemente-cache-nas-aplicaes-net-com-o-caching-application-block/" title="Implemente cache nas aplica&ccedil;&otilde;es .NET com o Caching Application Block">Implemente cache nas aplica&ccedil;&otilde;es .NET com o Caching Application Block (2)</a></li>
</ul>
<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/visual-studio-2008-express-edition/">Visual Studio 2008 Express Edition</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/visual-studio-2008-express-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://fdweb.com.br/visual-studio-2008-express-edition/</feedburner:origLink></item>
		<item>
		<title>Novidades do C# 3.0: Extension Methods</title>
		<link>http://feedproxy.google.com/~r/fdweb/~3/X4INPDLB5x0/</link>
		<comments>http://fdweb.com.br/novidades-do-c-30-extension-methods/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 15:00:03 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[methods]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=51</guid>
		<description><![CDATA[Outro recurso importante introduzido pelo C# &#233; a possibilidade de adicionar novos m&#233;todos &#224; classes j&#225; existentes. Com esse recurso, &#233; poss&#237;vel estender classes nativas do .net framwork (como as classes string ou int). Por exemplo, &#233; poss&#237;vel adicionar um m&#233;todos chamado &#8220;CepValido&#8221; &#224; classe string. E isso &#233; feito de uma forma bem simples. [...]<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/novidades-do-c-30-extension-methods/">Novidades do C# 3.0: Extension Methods</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Outro recurso importante introduzido pelo C# &eacute; a possibilidade de adicionar novos m&eacute;todos &agrave; classes j&aacute; existentes. Com esse recurso, &eacute; poss&iacute;vel estender classes nativas do .net framwork (como as classes string ou int). Por exemplo, &eacute; poss&iacute;vel adicionar um m&eacute;todos chamado &#8220;CepValido&#8221; &agrave; classe string. E isso &eacute; feito de uma forma bem simples. Apenas um cuidado deve-se tomar com rela&ccedil;&atilde;o ao <em>extension methods: </em>se n&atilde;o bem gerenciados, podem tornar-se um inferno para a manuten&ccedil;&atilde;o d&oacute; c&oacute;digo ou at&eacute; mesmo para a pr&oacute;pria implementa&ccedil;&atilde;o. Se por um lado podem ser muito &uacute;teis, por outro lado podem causar muitos problemas.</p>
<p>Vamos, ent&atilde;o, criar um m&eacute;todo que verifique se uma determinada <em>string</em> possui 8 caracteres e retornar <em>true </em>ou <em>false</em>. Fazemos isso com o c&oacute;digo abaixo:</p>
<p>public bool CepValido(string cep)<br />
{<br />
if (cep.Length == <img src='http://fdweb.com.br/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /><br />
return true;<br />
else<br />
return false;<br />
}</p>
<p>Por&eacute;m, este c&oacute;digo &eacute; apenas uma fun&ccedil;&atilde;o normal. Para que ela se torne uma extens&atilde;o da classe string precisamos fazer alguns ajustes ao c&oacute;digo.</p>
<ol>
<li>Os <em>extension methods</em> devem estar em uma classe p&uacute;blica e est&aacute;tica (public static class);</li>
<li>Devem, tamb&eacute;m, ser do tipo <em>public static;</em></li>
<li>Todo m&eacute;todo deve possuir pelo menos um par&acirc;metro, sendo este da classe a ser estendida, e possuir a palavra-chave <em>this</em> antes do tipo da classe;</li>
</ol>
<p>Vamos modificar o c&oacute;digo acima para que se torne, ent&atilde;o, um m&eacute;todo de extens&atilde;o:</p>
<p>public static class ExtensionClass<br />
{<br />
public static bool CepValido(this string cep)<br />
{<br />
if (cep.Length == <img src='http://fdweb.com.br/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /><br />
return true;<br />
else<br />
return false;<br />
}<br />
}</p>
<p>Note a visibilidade <strong>public static </strong>tanto na declara&ccedil;&atilde;o da classe como na declara&ccedil;&atilde;o do m&eacute;todo, bem como a palavra-chave <em>this</em> antes do tipo (string) da vari&aacute;vel &#8220;cep&#8221;.</p>
<p>Agora, para poder utilizar a extens&atilde;o que acabamos de criar, basta importar o namespace onde se encontra a nossa classe criada (se for o mesmo namespace que o resto da aplica&ccedil;&atilde;o n&atilde;o &eacute; necess&aacute;rio fazer nada. Se voc&ecirc; n&atilde;o sabe o que &eacute; namespace ent&atilde;o o c&oacute;digo provavelmente ir&aacute; funcionar por si s&oacute;.) para a classe onde iremos utilizar a extens&atilde;o e declarar uma vari&aacute;vel do tipo string. Depois &eacute; s&oacute; chamar o m&eacute;todo CepValido, conforme segue abaixo:</p>
<p>private void TesteExtensao()<br />
{<br />
string cep = &#8220;12345678&#8243;;<br />
if (cep.CepValido())<br />
MessageBox.Show(&#8221;Cep V&aacute;lido&#8221;);<br />
else<br />
MessageBox.Show(&#8221;Cep inv&aacute;lido&#8221;);</p>
<p>}</p>
<p>Como pode ser visto, &eacute; muito f&aacute;cil implementar m&eacute;todos de extens&atilde;o, possibilitante escrever um c&oacute;digo mais limpo e de f&aacute;cil manutenibilidade (se usados corretamente). &Eacute; importante lembrar, tamb&eacute;m, que caso haja conflito de nomes entre um m&eacute;todo da inst&acirc;ncia de uma classe (por exemplo, toString) e um <em>extension method</em>, os m&eacute;todos da inst&acirc;ncia t&ecirc;m preced&ecirc;ncia sobre os m&eacute;todos de extens&atilde;o, ou seja, o m&eacute;todo nativo ser&aacute; executado.<br />
<h3>Leia tamb&eacute;m</h3>
<ul class="related_post">
<li><a href="http://fdweb.com.br/novidades-do-c-30-automatic-properties/" title="Novidades do C# 3.0: Automatic Properties">Novidades do C# 3.0: Automatic Properties (0)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-object-initializers/" title="Novidades do C# 3.0: Object Initializers">Novidades do C# 3.0: Object Initializers (1)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/" title="Novidades do C# 3.0: Implicitly Typed Local Variables">Novidades do C# 3.0: Implicitly Typed Local Variables (1)</a></li>
<li><a href="http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/" title="Implementando controle de transa&ccedil;&otilde;es com TransactionScope ">Implementando controle de transa&ccedil;&otilde;es com TransactionScope  (2)</a></li>
<li><a href="http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/" title="Buscando o preview de um arquivo EPS em C# com ASP.NET">Buscando o preview de um arquivo EPS em C# com ASP.NET (0)</a></li>
</ul>
<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/novidades-do-c-30-extension-methods/">Novidades do C# 3.0: Extension Methods</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/novidades-do-c-30-extension-methods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://fdweb.com.br/novidades-do-c-30-extension-methods/</feedburner:origLink></item>
		<item>
		<title>Novidades do C# 3.0: Automatic Properties</title>
		<link>http://feedproxy.google.com/~r/fdweb/~3/ck-1BcRehXg/</link>
		<comments>http://fdweb.com.br/novidades-do-c-30-automatic-properties/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 17:00:53 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[automatic]]></category>
		<category><![CDATA[properties]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=39</guid>
		<description><![CDATA[Esta &#233;, sem d&#250;vida, uma das mais interessantes novidades introduzidas no C# 3.0: Propriedades Autom&#225;ticas. Pelo menos para mim, a declara&#231;&#227;o de propriedades &#233; algo bastante chato, j&#225; que al&#233;m de declarar as propriedades, temos tamb&#233;m que, normalmente, declarar vari&#225;veis privadas e implementar o get e o set de cada propriedade. Com o novo recurso [...]<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/novidades-do-c-30-automatic-properties/">Novidades do C# 3.0: Automatic Properties</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Esta &eacute;, sem d&uacute;vida, uma das mais interessantes novidades introduzidas no C# 3.0: <strong>Propriedades Autom&aacute;ticas. </strong>Pelo menos para mim, a declara&ccedil;&atilde;o de propriedades &eacute; algo bastante chato, j&aacute; que al&eacute;m de declarar as propriedades, temos tamb&eacute;m que, normalmente, declarar vari&aacute;veis privadas e implementar o <em>get</em> e o <em>set</em> de cada propriedade. Com o novo recurso de propriedades autom&aacute;ticas isto n&atilde;o &eacute; mais necess&aacute;rio.</p>
<p>Vamos aos exemplos. Vejamos como &eacute; forma antiga (e mais trabalhosa):</p>
<p>// Declara as vari&aacute;veis privadas</p>
<p>private string _nome;</p>
<p>private int _idade;</p>
<p>public string Nome<br />
{<br />
get<br />
{<br />
return _nome;<br />
}<br />
set<br />
{<br />
_nome = value;<br />
}</p>
<p>}</p>
<p>public int Idade</p>
<p>{<br />
get<br />
{<br />
return _idade;</p>
<p>}<br />
set<br />
{<br />
_idade = value;<br />
}</p>
<p>}</p>
<p>E agora vejamos como fica o c&oacute;digo acima no C# 3.0:</p>
<p>public string Nome { get; set; }<br />
public int Idade { get; set; }</p>
<p>Bem mais simples, n&atilde;o &eacute; mesmo? E ainda existe um atalho para a declara&ccedil;&atilde;o de propriedades no Visual Studio: basta digitar <strong>prop</strong> e pressionar a tecla TAB. O pr&oacute;prio VS monta o esqueleto da propriedade, como segue abaixo:</p>
<p>public int MyProperty { get; set; }</p>
<p>Com esse novo recurso e mais o atalho fica muito f&aacute;cil e r&aacute;pido criar propriedades.<br />
<h3>Leia tamb&eacute;m</h3>
<ul class="related_post">
<li><a href="http://fdweb.com.br/novidades-do-c-30-extension-methods/" title="Novidades do C# 3.0: Extension Methods">Novidades do C# 3.0: Extension Methods (0)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-object-initializers/" title="Novidades do C# 3.0: Object Initializers">Novidades do C# 3.0: Object Initializers (1)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/" title="Novidades do C# 3.0: Implicitly Typed Local Variables">Novidades do C# 3.0: Implicitly Typed Local Variables (1)</a></li>
<li><a href="http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/" title="Implementando controle de transa&ccedil;&otilde;es com TransactionScope ">Implementando controle de transa&ccedil;&otilde;es com TransactionScope  (2)</a></li>
<li><a href="http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/" title="Buscando o preview de um arquivo EPS em C# com ASP.NET">Buscando o preview de um arquivo EPS em C# com ASP.NET (0)</a></li>
</ul>
<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/novidades-do-c-30-automatic-properties/">Novidades do C# 3.0: Automatic Properties</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/novidades-do-c-30-automatic-properties/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://fdweb.com.br/novidades-do-c-30-automatic-properties/</feedburner:origLink></item>
		<item>
		<title>Novidades do C# 3.0: Object Initializers</title>
		<link>http://feedproxy.google.com/~r/fdweb/~3/KZ1NQYkuBV4/</link>
		<comments>http://fdweb.com.br/novidades-do-c-30-object-initializers/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 15:00:46 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[object initializers]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=34</guid>
		<description><![CDATA[Uma das novas funcionalidades do C# 3.0 s&#227;o os Objects Initializers, ou Inicializadores de Objetos. Esta novidade possibilita a inicializa&#231;&#227;o de objetos de uma forma mais pr&#225;tica e r&#225;pida. &#201; poss&#237;vel, inclusive, declarar e inicializar objetos com uma &#250;nica instru&#231;&#227;o.
Nas vers&#245;es anteriores, a inicializa&#231;&#227;o de objetos era feita da seguinte forma:
Cliente cli = new Cliente();
cli.Nome [...]<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/novidades-do-c-30-object-initializers/">Novidades do C# 3.0: Object Initializers</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Uma das novas funcionalidades do C# 3.0 s&atilde;o os Objects Initializers, ou <strong>Inicializadores de Objetos</strong>. Esta novidade possibilita a inicializa&ccedil;&atilde;o de objetos de uma forma mais pr&aacute;tica e r&aacute;pida. &Eacute; poss&iacute;vel, inclusive, declarar e inicializar objetos com uma &uacute;nica instru&ccedil;&atilde;o.</p>
<p>Nas vers&otilde;es anteriores, a inicializa&ccedil;&atilde;o de objetos era feita da seguinte forma:</p>
<p>Cliente cli = new Cliente();<br />
cli.Nome = &#8220;Fabio&#8221;;<br />
cli.Idade = 26;</p>
<p>Agora podemos abreviar esta inicializa&ccedil;&atilde;o, da seguinte forma:</p>
<p>Cliente cli = new Cliente() { Nome = &#8220;Fabio&#8221;, Idade = 26};</p>
<p>Ou ainda, para deixar o c&oacute;digo mais leg&iacute;vel:</p>
<p>Cliente cli = new Cliente()<br />
{<br />
Nome = &#8220;Fabio&#8221;,<br />
Idade = 26};<br />
}</p>
<p>De qualquer forma, seja em uma &uacute;nica linha ou mais, n&atilde;o deixa de ser um recurso bastante interessante.<br />
<h3>Leia tamb&eacute;m</h3>
<ul class="related_post">
<li><a href="http://fdweb.com.br/novidades-do-c-30-extension-methods/" title="Novidades do C# 3.0: Extension Methods">Novidades do C# 3.0: Extension Methods (0)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-automatic-properties/" title="Novidades do C# 3.0: Automatic Properties">Novidades do C# 3.0: Automatic Properties (0)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/" title="Novidades do C# 3.0: Implicitly Typed Local Variables">Novidades do C# 3.0: Implicitly Typed Local Variables (1)</a></li>
<li><a href="http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/" title="Implementando controle de transa&ccedil;&otilde;es com TransactionScope ">Implementando controle de transa&ccedil;&otilde;es com TransactionScope  (2)</a></li>
<li><a href="http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/" title="Buscando o preview de um arquivo EPS em C# com ASP.NET">Buscando o preview de um arquivo EPS em C# com ASP.NET (0)</a></li>
</ul>
<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/novidades-do-c-30-object-initializers/">Novidades do C# 3.0: Object Initializers</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/novidades-do-c-30-object-initializers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://fdweb.com.br/novidades-do-c-30-object-initializers/</feedburner:origLink></item>
		<item>
		<title>Novidades do C# 3.0: Implicitly Typed Local Variables</title>
		<link>http://feedproxy.google.com/~r/fdweb/~3/6CgOX0MOGNU/</link>
		<comments>http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 16:15:38 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[novidades]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=31</guid>
		<description><![CDATA[Tamb&#233;m conhecida como &#8220;Infer&#234;ncia de tipos de vari&#225;veis&#8221;
O C# 3.0 traz uma nova palavra-chave chamada &#8220;var&#8221;. Com ela &#233; poss&#237;vel declarar uma vari&#225;vel cujo tipo &#233; determinado implicitamente pela express&#227;o utilizada para inicializ&#225;-la. A verifica&#231;&#227;o do tipo da vari&#225;vel &#233; feita em tempo de compila&#231;&#227;o. Vejamos os exemplos a seguir:
// Inicializa a vari&#225;vel Nome com [...]<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/">Novidades do C# 3.0: Implicitly Typed Local Variables</a></p>
]]></description>
			<content:encoded><![CDATA[<h2>Tamb&eacute;m conhecida como &#8220;Infer&ecirc;ncia de tipos de vari&aacute;veis&#8221;</h2>
<p>O C# 3.0 traz uma nova palavra-chave chamada &#8220;var&#8221;. Com ela &eacute; poss&iacute;vel declarar uma vari&aacute;vel cujo tipo &eacute; determinado implicitamente pela express&atilde;o utilizada para inicializ&aacute;-la. A verifica&ccedil;&atilde;o do tipo da vari&aacute;vel &eacute; feita em tempo de compila&ccedil;&atilde;o. Vejamos os exemplos a seguir:</p>
<p>// Inicializa a vari&aacute;vel Nome com a o texto Fabio.<br />
// Em tempo de execu&ccedil;&atilde;o, Nome ser&aacute; do tipo string</p>
<p>var Nome = &#8220;Fabio&#8221;;</p>
<p>// Inicializa OutroNome a partir de Nome.<br />
// Ambas as variaveis ser&atilde;o do tipo string e conter&atilde;o o mesmo valor: &#8220;Fabio&#8221;</p>
<p>var OutroNome = Nome;</p>
<p>// Inicializa a vari&aacute;vel idade com o valor 20. Esta vari&aacute;vel ser&aacute; do tipo int;</p>
<p>var idade = 20;</p>
<p>Como vimos nos exemplos acima, podemos facilmente declarar uma vari&aacute;vel sem sabermos o tipo exato durante sua declara&ccedil;&atilde;o. Alguns podem se perguntar: por que n&atilde;o utilizar ent&atilde;o o tipo object? Pois bem, como dito, a verifica&ccedil;&atilde;o do tipo da vari&aacute;vel &eacute; feita em tempo de compila&ccedil;&atilde;o, o que significa que uma vari&aacute;vel declarada com o tipo <em>var</em> e inicializada com o texto &#8220;xxx&#8221; ser&aacute;, para o compilador, do tipo string.<br />
Ex.</p>
<p>var Nome = &#8220;Fabio&#8221;; // Nome ser&aacute; do tipo string</p>
<p>string OutroNome = Nome; //Funciona pois Nome &eacute; do tipo string</p>
<p>object Sobrenome = &#8220;Centenaro&#8221;; //Inicializa vari&aacute;vel do tipo object</p>
<p>Nome = Sobrenome;<br />
//Erro de compila&ccedil;&atilde;o. N&atilde;o &eacute; poss&iacute;vel converter implicitamente object para string.<br />
// &Eacute; obrigat&oacute;rio efetuar o cast.</p>
<p>Outra d&uacute;vida que pode surgir &eacute;: j&aacute; que o tipo <em>var </em>&#8220;converte&#8221; automaticamente a vari&aacute;vel, ent&atilde;o por que continuar usando string, int, bool? A resposta &eacute; muito simples: &Eacute; poss&iacute;vel, sim, usar var no lugar de qualquer outro tipo, por&eacute;m isso torna o c&oacute;digo mais dif&iacute;cil de entender e dar manuten&ccedil;&atilde;o. Al&eacute;m do que, em muitos casos, n&atilde;o podemos inicializar uma vari&aacute;vel com algum valor, e inicializar uma vari&aacute;vel do tipo <em>var</em> com um valor do tipo -1 ou 0 apenas para que ela seja do tipo <em>int</em> &eacute; fazer uso da programa&ccedil;&atilde;o orientada a gambiarra. Se queremos uma vari&aacute;vel do tipo <em>int</em>, ent&atilde;o por que n&atilde;o declar&aacute;-la como <em>int</em>?</p>
<p>Al&eacute;m disso, mais algumas considera&ccedil;&otilde;es devem ser feitas:</p>
<ul>
<li>Este tipo de vari&aacute;vel n&atilde;o pode ser inicializada com o valor <em>null </em>(ou <em>Nothing</em> no VB);</li>
<li>Elas necessitam, obrigatoriamente, serem inicializadas e declaradas na mesma instru&ccedil;&atilde;o;</li>
<li>S&oacute; podem ser usadas como vari&aacute;veis locais, dentro de m&eacute;todos, e n&atilde;o como vari&aacute;veis de uma classe, nem como vari&aacute;veis p&uacute;blicas;</li>
<li>Elas s&atilde;o largamente utilizadas para declarar tipos an&ocirc;minos como parte de express&otilde;es do LINQ. Na verdade, esta &eacute; a principal fun&ccedil;&atilde;o deste tipo de vari&aacute;vel.</li>
</ul>
<h3>Leia tamb&eacute;m</h3>
<ul class="related_post">
<li><a href="http://fdweb.com.br/novidades-do-c-30-extension-methods/" title="Novidades do C# 3.0: Extension Methods">Novidades do C# 3.0: Extension Methods (0)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-automatic-properties/" title="Novidades do C# 3.0: Automatic Properties">Novidades do C# 3.0: Automatic Properties (0)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-object-initializers/" title="Novidades do C# 3.0: Object Initializers">Novidades do C# 3.0: Object Initializers (1)</a></li>
<li><a href="http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/" title="Implementando controle de transa&ccedil;&otilde;es com TransactionScope ">Implementando controle de transa&ccedil;&otilde;es com TransactionScope  (2)</a></li>
<li><a href="http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/" title="Buscando o preview de um arquivo EPS em C# com ASP.NET">Buscando o preview de um arquivo EPS em C# com ASP.NET (0)</a></li>
</ul>
<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/">Novidades do C# 3.0: Implicitly Typed Local Variables</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/</feedburner:origLink></item>
		<item>
		<title>Implementando controle de transações com TransactionScope</title>
		<link>http://feedproxy.google.com/~r/fdweb/~3/B7JQtO35_7c/</link>
		<comments>http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/#comments</comments>
		<pubDate>Mon, 23 Jun 2008 18:55:17 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[transacao]]></category>
		<category><![CDATA[transactionscope]]></category>
		<category><![CDATA[vb.net]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=27</guid>
		<description><![CDATA[Controle de transa&#231;&#245;es &#233; algo que passa batido em sistemas pequenos ou em sistemas onde a preocupa&#231;&#227;o com a consist&#234;ncia dos dados n&#227;o &#233; relevante (n&#227;o vou entrar na quest&#227;o que se um sistema possui dados inconsistentes ent&#227;o &#233; melhor n&#227;o ter sistema algum). Mas o n&#250;mero de programadores que n&#227;o utilizam algum sistema de [...]<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/">Implementando controle de transa&ccedil;&otilde;es com TransactionScope</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Controle de transa&ccedil;&otilde;es &eacute; algo que passa batido em sistemas pequenos ou em sistemas onde a preocupa&ccedil;&atilde;o com a consist&ecirc;ncia dos dados n&atilde;o &eacute; relevante (n&atilde;o vou entrar na quest&atilde;o que se um sistema possui dados inconsistentes ent&atilde;o &eacute; melhor n&atilde;o ter sistema algum). Mas o n&uacute;mero de programadores que n&atilde;o utilizam algum sistema de controle de transa&ccedil;&atilde;o &eacute; bastante grande e a preocupa&ccedil;&atilde;o com os dados e a sua consist&ecirc;ncia acaba ficando em segundo plano. Deixou de ser exce&ccedil;&atilde;o o sistema que deve estar pronto em um curt&iacute;ssimo espa&ccedil;o de tempo e com isso outros aspectos que deveriam ser exce&ccedil;&atilde;o se tornaram regras. E controle de transa&ccedil;&atilde;o &eacute; um deles. Neste artigo veremos como implementar um sistema de transa&ccedil;&otilde;es utilizando o .NET Framework.</p>
<h2>Introdu&ccedil;&atilde;o</h2>
<p>O controle de transa&ccedil;&atilde;o serve para garantir a integridade dos dados. Isso significa que atrav&eacute;s dele podemos ter a certeza de que todos os dados ser&atilde;o gravados no banco de dados. Em caso de eventual falha em algum momento da grava&ccedil;&atilde;o todo o processo volta ao estado inicial, sem inser&ccedil;&otilde;es parciais. Ao encontrar um erro durante o processo (leia-se um ou mais <em>inserts</em> em seq&uuml;encia) simplesmente &eacute; dado um <em>rollback</em> e nada &eacute; gravado no banco. Ao completar o processo com sucesso, a transa&ccedil;&atilde;o d&aacute; um <em>commit</em> e grava os dados no banco.</p>
<h2>Exemplificando</h2>
<p>Peguemos um sistema de vendas como exemplo. Para efetuar um pedido, devemos gravar as informa&ccedil;&otilde;es do cliente na tabela <strong>cliente</strong>, os itens do pedido na tabela <strong>itens</strong>, atualizar o estoque na tabela <strong>produtos</strong> e por fim gravar os dados da venda na tabela <strong>vendas</strong>. Agora imaginemos que no meio deste processo &eacute; gerado algum erro. Digamos que j&aacute; tenhamos inserido os dados na tabela de clientes, os itens do pedido e atualizado o estoque. Falta apenas gravar os dados da venda. E neste momento ocorre algum erro. O que fazer com os dados que j&aacute; foram gravados? Como fica o estoque que j&aacute; foi atualizado? Em um sistema que n&atilde;o possui nenhum tipo de controle, isso seria o caos: o estoque fica comprometido, o banco de dados ganha inconsist&ecirc;ncias e nunca o sistema ser&aacute; confi&aacute;vel.</p>
<h2>Pondo a teoria em pr&aacute;tica</h2>
<p>Ent&atilde;o vamos implementar o nosso controle de transa&ccedil;&otilde;es utilizando o TransactionScope, fornecido pela biblioteca <em>System.Transactions.dll</em>. Em primeiro lugar devemos adicionar a referencia da biblioteca em nosso projeto. Com isso, basta ir no menu <strong>Project </strong>e depois em <strong>Add Reference</strong>.</p>
<p><img src="http://img77.imageshack.us/img77/4401/addreferencewm3.jpg" alt="Add Reference" width="374" height="396" /></p>
<p>Depois selecionamos o assembly System.Transactions.</p>
<p><img src="http://img369.imageshack.us/img369/8949/addtransactionup4.jpg" alt="Adding System.Transactions" /></p>
<p>Depois disso &eacute; s&oacute; p&ocirc;r a m&atilde;o na massa. Primeiramente adicionamos a refer&ecirc;ncia &agrave; nossa classe.</p>
<p>Em C#</p>
<blockquote><p>using System.Transactions;</p></blockquote>
<p>Em VB</p>
<blockquote><p>Imports System.Transactions</p></blockquote>
<p>Feito isso, agora implementar o controle de transa&ccedil;&otilde;es:</p>
<p>Em C#</p>
<blockquote><p>TransactionOptions options = new TransactionOptions();<br />
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;</p>
<p>using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))<br />
{<br />
//Insira os comandos de insert aqui</p>
<p>scope.Complete();</p>
<p>}</p></blockquote>
<p>Em VB.NET</p>
<blockquote><p>Using scope As New TransactionScope(TransactionScopeOption.Required, IsolationLevel.ReadCommitted)<br />
&#8216;* Insira os comandos de insert aqui<br />
scope.Complete()<br />
End Using</p></blockquote>
<h2>Par&acirc;metros Necess&aacute;rios</h2>
<p>Para criar uma nova inst&acirc;ncia de um TransactionScope, devemos passar alguns par&acirc;metros.</p>
<h3><strong>TransactionScopeOption</strong></h3>
<p>Em TransactionScopeOption temos as seguintes op&ccedil;&otilde;es:</p>
<p><strong>Required </strong>- Re-utiliza uma transa&ccedil;&atilde;o ativa ou cria uma nova caso n&atilde;o haja nenhuma ativa.</p>
<p><strong>RequiresNew</strong> &#8211; Cria sempre uma nova transa&ccedil;&atilde;o sem re-aproveitar outra transa&ccedil;&atilde;o.</p>
<p><strong>Suppress</strong> &#8211; Simplesmente n&atilde;o utiliza nenhuma transa&ccedil;&atilde;o.</p>
<h3><strong>IsolationLevel </strong></h3>
<p><strong>Serializable &#8211; </strong>Os dados, durante a transa&ccedil;&atilde;o, podem ser lidos mas nenhum dado pode ser adicionado ou modificado.</p>
<p><strong>RepetableRead &#8211; </strong>Os dados podem ser lidos e adicionados mas n&atilde;o podem ser modificados.</p>
<p><strong>ReadCommited &#8211; </strong>Dados n&atilde;o podem ser lidos, mas podem ser modificados.</p>
<p><strong>ReadUncommited &#8211; </strong>Dados podem ser lidos e modificados durante a transa&ccedil;&atilde;o.</p>
<p><strong>Snapshot &#8211; </strong>Os dados podem ser lidos e modificados, por&eacute;m, antes de modificar alguma informa&ccedil;&atilde;o, a transa&ccedil;&atilde;o verifica se o conjunto de dados permanecem os mesmos. Se tiverem sido alterados, uma exce&ccedil;&atilde;o &eacute; gerada.</p>
<p><strong>Chaos</strong> &#8211; As altera&ccedil;&otilde;es pendentes de transa&ccedil;&otilde;es em n&iacute;veis superiores n&atilde;o podem ser sobrepostas.</p>
<p><strong>Unspecified</strong> &#8211; Um IsolationLevel diferente do atual est&aacute; sendo usado, mas n&atilde;o &eacute; poss&iacute;vel determinar o seu tipo. Neste caso &eacute; gerada uma exce&ccedil;&atilde;o.</p>
<h2>Finalizando</h2>
<p>Implementar um controle de transa&ccedil;&otilde;es &eacute; algo muito simples e poupa muita dor de cabe&ccedil;a. O ideal seria que todos os sistemas, por mais simples que sejam, utilizassem um controle como este. Desta forma seria poss&iacute;vel entregar sistemas mais seguros e confi&aacute;veis, melhorando a qualidade do produto e a imagem do desenvolvedor junto aos clientes.<br />
<h3>Leia tamb&eacute;m</h3>
<ul class="related_post">
<li><a href="http://fdweb.com.br/novidades-do-c-30-extension-methods/" title="Novidades do C# 3.0: Extension Methods">Novidades do C# 3.0: Extension Methods (0)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-automatic-properties/" title="Novidades do C# 3.0: Automatic Properties">Novidades do C# 3.0: Automatic Properties (0)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-object-initializers/" title="Novidades do C# 3.0: Object Initializers">Novidades do C# 3.0: Object Initializers (1)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/" title="Novidades do C# 3.0: Implicitly Typed Local Variables">Novidades do C# 3.0: Implicitly Typed Local Variables (1)</a></li>
<li><a href="http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/" title="Buscando o preview de um arquivo EPS em C# com ASP.NET">Buscando o preview de um arquivo EPS em C# com ASP.NET (0)</a></li>
</ul>
<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/">Implementando controle de transa&ccedil;&otilde;es com TransactionScope</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/</feedburner:origLink></item>
		<item>
		<title>Buscando o preview de um arquivo EPS em C# com ASP.NET</title>
		<link>http://feedproxy.google.com/~r/fdweb/~3/tEt1SY8XTmk/</link>
		<comments>http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 16:26:56 +0000</pubDate>
		<dc:creator>Daniel Nogueira</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[eps]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/?p=26</guid>
		<description><![CDATA[Dentro de um arquivo EPS (Encapsulated Postscript) podemos encontrar um preview da imagem  em TIFF. O TIFF encontrado no EPS &#233; bastante &#250;til para n&#227;o necessitamos de programas como o PhotoShop, CorelDraw, Illustrator ou outros para serem visualizados, como por exemplo gerar um thumbnail da imagem.
Neste artigo vou mostrar como buscar este TIFF para [...]<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/">Buscando o preview de um arquivo EPS em C# com ASP.NET</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Dentro de um arquivo EPS (Encapsulated Postscript) podemos encontrar um preview da imagem  em TIFF. O TIFF encontrado no EPS &eacute; bastante &uacute;til para n&atilde;o necessitamos de programas como o PhotoShop, CorelDraw, Illustrator ou outros para serem visualizados, como por exemplo gerar um thumbnail da imagem.</p>
<p>Neste artigo vou mostrar como buscar este TIFF para podermos trabalhar com ele.</p>
<h2>Exemplo</h2>
<p>Este exemplo consiste em efetuar o upload de um arquivo EPS, e mostrar o preview do arquivo EPS na p&aacute;gina.</p>
<p>1 &#8211; Crie o arquivo Default.aspx que vai conter a interface do exemplo;</p>
<p>2 &#8211; Insira no arquivo um component FileUpload e o renomeie para FileUploadEps;</p>
<p>3 &#8211; E insira um componente Button e o renomeie para ButtonUploadEps;</p>
<p>Arquivo Default.aspx</p>
<blockquote><p>&lt;%@ Page Language=&#8221;C#&#8221; AutoEventWireup=&#8221;true&#8221;  CodeFile=&#8221;Default.aspx.cs&#8221; Inherits=&#8221;_Default&#8221; %&gt;</p>
<p>&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8220;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221;&gt;</p>
<p>&lt;html xmlns=&#8221;http://www.w3.org/1999/xhtml&#8221; &gt;<br />
&lt;head runat=&#8221;server&#8221;&gt;<br />
&lt;title&gt;Preview de Arquivos EPS&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;form id=&#8221;form1&#8243; runat=&#8221;server&#8221;&gt;<br />
&lt;div&gt;<br />
&lt;asp:FileUpload ID=&#8221;FileUploadEps&#8221; runat=&#8221;server&#8221; Style=&#8221;position: relative&#8221; /&gt;<br />
&lt;asp:Button ID=&#8221;ButtonUploadEps&#8221; runat=&#8221;server&#8221; OnClick=&#8221;ButtonUploadEps_Click&#8221; Style=&#8221;position:relative&#8221; Text=&#8221;Upload EPS&#8221; /&gt;<br />
&lt;/div&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p></blockquote>
<p>4 &#8211; Crie o arquivo Default.aspx.cs que vai conter o c&oacute;digo em C#;</p>
<p>5 &#8211; Use os seguintes namespace:</p>
<blockquote><p>using System;<br />
using System.Data;<br />
using System.Configuration;<br />
using System.Web;<br />
using System.Web.Security;<br />
using System.Web.UI;<br />
using System.Web.UI.WebControls;<br />
using System.Web.UI.WebControls.WebParts;</p>
<p>using System.Web.UI.HtmlControls;</p>
<p>using System.IO;<br />
using System.Drawing;<br />
using System.Drawing.Imaging;</p></blockquote>
<p>6 &#8211; Crie o evento de click do bot&atilde;o &#8220;ButtonUploadEps&#8221; e insira nele o seguinte c&oacute;digo:</p>
<blockquote><p>FileStream fileStreamEps = null;<br />
string strCaminhoEpsUpload = &#8220;&#8221;;</p>
<p>//* Verifica se o usu&aacute;rio selecionou algum arquivo<br />
if (FileUploadEps.PostedFile.FileName != &#8220;&#8221;)<br />
{</p>
<p>//* Monta o caminho da onde o arquivo vai ser salvo<br />
strCaminhoEpsUpload = MapPath(&#8221;.&#8221;) + &#8220;\\&#8221; + Path.GetFileName(FileUploadEps.PostedFile.FileName);</p>
<p>//* Executa o upload do arquivo<br />
FileUploadEps.PostedFile.SaveAs(strCaminhoEpsUpload);</p>
<p>//* Abre o arquivo e l&ecirc; o header<br />
fileStreamEps = File.Open(strCaminhoEpsUpload, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);</p>
<p>byte[] buf = new byte[32];</p>
<p>//* Passa para o buffer o header do arquivo<br />
fileStreamEps.Read(buf, 0, 32);</p>
<p>//* Converte para uint<br />
uint idArquivo = obtemU(buf, 0);</p>
<p>//* Verifica se o arquivo de entrada &eacute; um EPS<br />
if (idArquivo != 0xc6d3d0c5)<br />
{</p>
<p>return;</p>
<p>}</p>
<p>//* obtem o uint<br />
uint TIFOff = obtemU(buf, 20);</p>
<p>//* Verifica se foi encontrado no EPS a identifica&ccedil;&atilde;o de preview<br />
if (TIFOff == 0)<br />
{</p>
<p>return;</p>
<p>}</p>
<p>//* N&atilde;o posicionou no TifOffset<br />
if (fileStreamEps.Seek(TIFOff, SeekOrigin.Begin) != TIFOff)<br />
{<br />
return;<br />
}</p>
<p>//* obtem o uint<br />
uint TIFSize = obtemU(buf, 24);</p>
<p>//* Redimensiona o buffer<br />
byte[] msBuf = new Byte[TIFSize];</p>
<p>//* Passa o arquivo para a mem&oacute;ria<br />
MemoryStream memoryStreamEps = new MemoryStream(msBuf);<br />
fileStreamEps.Read(msBuf, 0, (int)TIFSize);</p>
<p>//* Cria um novo bitmap apartir do conteudo da memoria<br />
Bitmap bitMapEps = new Bitmap(memoryStreamEps);</p>
<p>//* Mostra a imagem na tela<br />
bitMapEps.Save(Response.OutputStream, ImageFormat.Jpeg);<br />
bitMapEps.Dispose();<br />
}</p></blockquote>
<p>7 &#8211; Crie uma fun&ccedil;&atilde;o para obter o uint:</p>
<blockquote><p>private static uint obtemU(byte[] buf, int pos)<br />
{<br />
return (uint)(buf[pos] + 0&#215;100 * buf[pos + 1] + 0&#215;10000 * buf[pos + 2] + 0&#215;1000000 * buf[pos + 3]);<br />
}</p></blockquote>
<p>Vale lembrar que n&atilde;o s&atilde;o todos os EPS que contem um arquivo de preview. Na hora de salvar a imagem em EPS o usu&aacute;rio tem a escolha, se deseja salvar o preview, e em qual qualidade ser&aacute; gerado o preview.</p>
<h2>Download do Exemplo</h2>
<p>Clique <a href="http://fdweb.com.br/downloads/EpsPreviewCSharpAspNet.rar">aqui</a> para efetuar o download  do projeto de exemplo. O projeto foi criado no Visual Studio 2005.<br />
<h3>Leia tamb&eacute;m</h3>
<ul class="related_post">
<li><a href="http://fdweb.com.br/novidades-do-c-30-extension-methods/" title="Novidades do C# 3.0: Extension Methods">Novidades do C# 3.0: Extension Methods (0)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-automatic-properties/" title="Novidades do C# 3.0: Automatic Properties">Novidades do C# 3.0: Automatic Properties (0)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-object-initializers/" title="Novidades do C# 3.0: Object Initializers">Novidades do C# 3.0: Object Initializers (1)</a></li>
<li><a href="http://fdweb.com.br/novidades-do-c-30-implicitly-typed-local-variables/" title="Novidades do C# 3.0: Implicitly Typed Local Variables">Novidades do C# 3.0: Implicitly Typed Local Variables (1)</a></li>
<li><a href="http://fdweb.com.br/implementando-controle-de-transacoes-com-transactionscope/" title="Implementando controle de transa&ccedil;&otilde;es com TransactionScope ">Implementando controle de transa&ccedil;&otilde;es com TransactionScope  (2)</a></li>
</ul>
<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/">Buscando o preview de um arquivo EPS em C# com ASP.NET</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://fdweb.com.br/buscando-o-preview-de-um-arquivo-eps-em-csharp-com-aspnet/</feedburner:origLink></item>
		<item>
		<title>Gerando arquivos PDF com PHP</title>
		<link>http://feedproxy.google.com/~r/fdweb/~3/fHB-tyWTh9c/</link>
		<comments>http://fdweb.com.br/gerando-arquivos-pdf-com-php/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 19:03:27 +0000</pubDate>
		<dc:creator>Fabio Centenaro</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[fpdf]]></category>
		<category><![CDATA[pdf]]></category>

		<guid isPermaLink="false">http://fdweb.com.br/gerando-arquivos-pdf-com-php/</guid>
		<description><![CDATA[Introdu&#231;&#227;o
Os arquivos PDF se transformaram ao longo do tempo em um padr&#227;o para troca de documentos. Desde relat&#243;rios at&#233; contratos, este formato tem sido usado em larga escala devido a sua portabilidade &#8211; &#233; poss&#237;vel abrir arquivos deste tipo em qualquer sistema operacional &#8211; al&#233;m de, geralmente, ser um arquivo pequeno. Isso sem falar que [...]<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/gerando-arquivos-pdf-com-php/">Gerando arquivos PDF com PHP</a></p>
]]></description>
			<content:encoded><![CDATA[<h2>Introdu&ccedil;&atilde;o</h2>
<p>Os arquivos PDF se transformaram ao longo do tempo em um padr&atilde;o para troca de documentos. Desde relat&oacute;rios at&eacute; contratos, este formato tem sido usado em larga escala devido a sua portabilidade &#8211; &eacute; poss&iacute;vel abrir arquivos deste tipo em qualquer sistema operacional &#8211; al&eacute;m de, geralmente, ser um arquivo pequeno. Isso sem falar que um arquivo PDF n&atilde;o pode ser modificado, garantindo, desta forma, que o arquivo ir&aacute; sempre manter o mesmo conte&uacute;do. Eu arriscaria dizer, ainda, que passa uma apar&ecirc;ncia mais profissional enviar um arquivo em formato PDF, ao inv&eacute;s de outros formatos, como DOC, por exemplo.</p>
<p>Neste artigo iremos conhecer os fundamentos da cria&ccedil;&atilde;o de um arquivo PDF utilizando a linguagem PHP. Para tal, ser&aacute; usada a biblioteca <a title="FPDF - PHP Classes" href="http://www.phpclasses.org/browse/package/421.html" target="_blank">FPDF</a>, respons&aacute;vel pela cria&ccedil;&atilde;o do arquivo. O download pode ser feito <a title="FPDF" href="http://www.fpdf.org/en/download.php" target="_blank">aqui</a>.</p>
<h2>Conhecendo as principais fun&ccedil;&otilde;es</h2>
<p>Abaixo est&atilde;o relacionadas as principais fun&ccedil;&otilde;es que ser&atilde;o utilizadas para a cria&ccedil;&atilde;o do arquivo, com a respectiva descri&ccedil;&atilde;o.</p>
<p><strong>SetFont </strong>- Define a fonte que ser&aacute; usada para imprimir o texto. &Eacute; obrigat&oacute;rio setar ao menos uma vez a fonte que ser&aacute; utilizada no documento.</p>
<p><strong>SetTitle </strong>- Define o t&iacute;tulo do documento.</p>
<p><strong>SetSubject </strong>- Define o assunto do documento.</p>
<p><strong>SetX </strong>-  Define a abscissa da posi&ccedil;&atilde;o corrente. A grosso modo podemos dizer que informa a posi&ccedil;&atilde;o a partir da margem esquerda do documento.</p>
<p><strong>SetY </strong>- Explicando de uma forma simples, indica a linha (posi&ccedil;&atilde;o vertical).</p>
<p><strong>Cell </strong>- Imprime uma c&eacute;lula (&aacute;rea retangular) com bordas opcionais, cor de fundo e texto. O canto superior-esquerdo da c&eacute;lula corresponde &agrave; posi&ccedil;&atilde;o atual. O texto pode ser alinhado ou centralizado. Depois de chamada, a posi&ccedil;&atilde;o atual se move para a direita ou para a linha seguinte. &Eacute; poss&iacute;vel p&ocirc;r um link no texto. Se a quebra de p&aacute;gina autom&aacute;tica est&aacute; habilitada e a pilha for al&eacute;m do limite, uma quebra de p&aacute;gina &eacute; feita antes da impress&atilde;o.</p>
<p><strong>Ln </strong>- Faz uma quebra de linha. A abscissa corrente volta para a margem esquerda e a ordenada &eacute; somada ao valor passado como par&acirc;metro.</p>
<p><strong>MultiCell </strong>- Este m&eacute;todo permite imprimir um texto com quebras de linha. Podem ser autom&aacute;tica (assim que o texto alcan&ccedil;a a margem direita da c&eacute;lula) ou expl&iacute;cita (atrav&eacute;s do caracter n). Ser&atilde;o geradas tantas c&eacute;lulas quantas forem necess&aacute;rias, uma abaixo da outra.</p>
<p><strong>Image </strong>- Permite inserir uma imagem no documento. Os tipos permitidos s&atilde;o JPG e PNG.</p>
<p><strong>AddPage </strong>- Acrescenta uma p&aacute;gina ao documento.</p>
<p><strong>PageNo </strong>- Informa a p&aacute;gina atual.</p>
<p><strong>AliasNbPages </strong>- Define um apelido para a impress&atilde;o do n&uacute;mero total de p&aacute;ginas.</p>
<p><strong>Header </strong>e <strong>Footer </strong>- Estes m&eacute;todos inserem automaticamente o cabe&ccedil;alho e rodap&eacute; das p&aacute;ginas do documento. Por&eacute;m, para utiliz&aacute;-las, &eacute; necess&aacute;rio criar uma subclasse para sobrepor os m&eacute;todos originais.</p>
<p><strong>Output</strong> &#8211;   Envia o documento para o destino informado. Pode-se abrir o arquivo no navegador, fazer o download ou mesmo salvar o arquivo no disco.</p>
<h3>OBSERVA&Ccedil;&Atilde;O:</h3>
<p>Sempre que for necess&aacute;rio setar a posi&ccedil;&atilde;o X e Y, sete primeiro o Y e depois o X.</p>
<h2>Criando nosso primeiro documento</h2>
<p>Agora vamos ver como criar um arquivo simples, contendo algum texto e uma imagem.</p>
<blockquote><p>&lt;?</p>
<p>require_once(&#8221;fpdf/fpdf.php&#8221;);</p>
<p>$texto = &#8220;Os arquivos PDF se transformaram ao longo do tempo em um padr&atilde;o para troca de documentos. Desde relat&oacute;rios at&eacute; contratos, este formato<br />
tem sido usado em larga escala devido a sua portabilidade  &#8211; &eacute; poss&iacute;vel abrir arquivos deste tipo em qualquer sistema operacional &#8211; al&eacute;m de, geralmente, ser um arquivo pequeno.<br />
Isso sem falar que um arquivo PDF n&atilde;o pode ser modificado,  garantindo, desta forma, que o arquivo ir&aacute; sempre manter o  mesmo conte&uacute;do. Eu arriscaria dizer, ainda, que passa uma<br />
apar&ecirc;ncia mais profissional enviar um arquivo em formato PDF,  ao inv&eacute;s de outros formatos, como DOC, por exemplo.&#8221;;</p>
<p>//defininfo a fonte !<br />
define(&#8217;FPDF_FONTPATH&#8217;,'fpdf/font/&#8217;);</p>
<p>//instancia a classe<br />
//uso: FPDF(orientacao &#8211; retrato ou paisagem), unidade de medida, tamanho do papel)<br />
$pdf = new FPDF(&#8221;P&#8221;,&#8221;mm&#8221;,&#8221;A4&#8243;);</p>
<p>//define a fonte a ser usada<br />
//uso: SetFont(nome da fonte, estilo (branco = normal, b = negrito, i = italico, u = sublinhado), tamanho da fonte)<br />
$pdf-&gt;SetFont(&#8217;arial&#8217;,&#8221;,10);</p>
<p>//define o titulo<br />
$pdf-&gt;SetTitle(&#8221;Criando nosso primeiro arquivo PDF !&#8221;);</p>
<p>// seta a posicao vertical e horizontal<br />
$pdf-&gt;SetY(&#8221;-1&#8243;);</p>
<p>//assunto<br />
$pdf-&gt;SetSubject(&#8221;Cria&ccedil;&atilde;o de arquivos PDF com PHP!&#8221;);</p>
<p>//escreve o texto<br />
//uso: Cell(largura, altura, conteudo, borda, quebra de linha, alinhamento (L = esquerdo, R = direito, C = centralizado)<br />
$pdf-&gt;Cell(0,5,&#8221;Criando arquivos PDF com PHP&#8221;,0,0,&#8217;L');<br />
$pdf-&gt;Cell(0,5,&#8217;http://fdweb.com.br&#8217;,0,1,&#8217;R');<br />
$pdf-&gt;Cell(0,0,&#8221;,1,1,&#8217;L');<br />
$pdf-&gt;Ln(8);</p>
<p>//Seta a fonte do texto do documento<br />
$pdf-&gt;SetFont(&#8217;arial&#8217;,&#8221;,8);</p>
<p>// insere a imagem<br />
//uso: Image(caminho, posicao X,posicao Y,altura, largura)<br />
//$pdf-&gt;Image(&#8221;http://fdweb.com.br/downloads/logo.jpg&#8221;, $pdf-&gt;GetX(), $pdf-&gt;GetY(), 20, 20);<br />
$pdf-&gt;Image(&#8221;logo.jpg&#8221;,10,30);</p>
<p>//posiciona horizontalmente<br />
$pdf-&gt;SetY(&#8221;30&#8243;);<br />
$pdf-&gt;SetX(&#8221;50&#8243;);</p>
<p>//Insere o texto do documento<br />
//uso: MultiCell(largura, altura, conteudo, borda, quebra de linha, alinhamento (L = esquerdo, R = direito, C = centralizado, J = justificado)<br />
$pdf-&gt;MultiCell(0,5,$texto,0,&#8221;L&#8221;,0);</p>
<p>$pdf-&gt;Output(&#8221;arquivo pdf&#8221;,&#8221;I&#8221;);</p>
<p>?&gt;</p></blockquote>
<p>Este exemplo mostra como criar um arquivo simples, com texto e uma imagem.</p>
<h2>Implementando cabe&ccedil;alho e rodap&eacute;</h2>
<p>Para que todas as p&aacute;ginas possuam cabe&ccedil;alho e rodap&eacute; padr&atilde;o, temos que estender a classe FPDF e sobrepor os m&eacute;todos Header e Footer. Note que a partir desse momento, ao inv&eacute;s de chamarmos a classe FPDF para gerarmos os documentos iremos passar a chamar a nossa classe estendida. Observe:</p>
<blockquote><p>&lt;?</p>
<p>require_once(&#8221;fpdf/fpdf.php&#8221;);</p>
<p>class PDF extends FPDF<br />
{</p>
<p>// sobrep&otilde;e o m&eacute;todo header<br />
function Header()<br />
{<br />
//escreve o texto<br />
//uso: Cell(largura, altura, conteudo, borda, quebra de linha, alinhamento (L = esquerdo, R = direito, C = centralizado)<br />
//$this-&gt;SetY(-1);<br />
$this-&gt;SetFont(&#8217;arial&#8217;,&#8221;,8);<br />
$this-&gt;Cell(0,5,&#8221;Criando arquivos PDF com PHP&#8221;,0,0,&#8217;L');<br />
$this-&gt;Cell(0,5,&#8217;http://fdweb.com.br&#8217;,0,1,&#8217;R');<br />
$this-&gt;Cell(0,0,&#8221;,1,1,&#8217;L');<br />
$this-&gt;Ln(8);</p>
<p>}<br />
// sobrep&otilde;e o m&eacute;todo footer<br />
function Footer()<br />
{<br />
//Vai para 1.5 cm da parte inferior</p>
<p>$this-&gt;SetY(-15);</p>
<p>//Seleciona a fonte Arial it&aacute;lico 8</p>
<p>$this-&gt;SetFont(&#8217;Arial&#8217;,'I&#8217;,8);</p>
<p>//Imprime o n&uacute;mero da p&aacute;gina corrente e o total de p&aacute;ginas</p>
<p>$this-&gt;Cell(0,10,&#8217;P&aacute;gina &#8216;.$this-&gt;PageNo().&#8217; de {total}&#8217;,0,0,&#8217;C');<br />
}<br />
}</p>
<p>$texto = &#8220;Os arquivos PDF se transformaram ao longo do tempo em um padr&atilde;o para troca de documentos. Desde relat&oacute;rios at&eacute; contratos, este formato<br />
tem sido usado em larga escala devido a sua portabilidade  &#8211; &eacute; poss&iacute;vel abrir arquivos deste tipo em qualquer sistema operacional &#8211; al&eacute;m de, geralmente, ser um arquivo pequeno.<br />
Isso sem falar que um arquivo PDF n&atilde;o pode ser modificado,  garantindo, desta forma, que o arquivo ir&aacute; sempre manter o  mesmo conte&uacute;do. Eu arriscaria dizer, ainda, que passa uma<br />
apar&ecirc;ncia mais profissional enviar um arquivo em formato PDF,  ao inv&eacute;s de outros formatos, como DOC, por exemplo.&#8221;;</p>
<p>//defininfo a fonte !<br />
define(&#8217;FPDF_FONTPATH&#8217;,'fpdf/font/&#8217;);</p>
<p>//instancia a classe<br />
//uso: PDF(orientacao &#8211; retrato ou paisagem), unidade de medida, tamanho do papel)<br />
$pdf = new PDF(&#8221;P&#8221;,&#8221;mm&#8221;,&#8221;A4&#8243;);</p>
<p>$pdf-&gt;AliasNbPages( &#8216;{total}&#8217; );</p>
<p>$pdf-&gt;AddPage();</p>
<p>//define a fonte a ser usada<br />
//uso: SetFont(nome da fonte, estilo (branco = normal, b = negrito, i = italico, u = sublinhado), tamanho da fonte)<br />
$pdf-&gt;SetFont(&#8217;arial&#8217;,&#8221;,10);</p>
<p>//define o titulo<br />
$pdf-&gt;SetTitle(&#8221;Criando nosso primeiro arquivo PDF !&#8221;);</p>
<p>//assunto<br />
$pdf-&gt;SetSubject(&#8221;Cria&ccedil;&atilde;o de arquivos PDF com PHP!&#8221;);</p>
<p>//Seta a fonte do texto do documento<br />
$pdf-&gt;SetFont(&#8217;arial&#8217;,&#8221;,8);</p>
<p>// insere a imagem<br />
//uso: Image(caminho, posicao X,posicao Y,altura, largura)<br />
//$pdf-&gt;Image(&#8221;http://fdweb.com.br/downloads/logo.jpg&#8221;,$pdf-&gt;GetX(),$pdf-&gt;GetY(),20,20);<br />
$pdf-&gt;Image(&#8221;logo.jpg&#8221;,10,30);</p>
<p>//posiciona horizontalmente<br />
$pdf-&gt;SetY(&#8221;30&#8243;);<br />
$pdf-&gt;SetX(&#8221;50&#8243;);</p>
<p>//Insere o texto do documento<br />
//uso: MultiCell(largura, altura, conteudo, borda, quebra de linha, alinhamento (L = esquerdo, R = direito, C = centralizado, J = justificado)<br />
$pdf-&gt;MultiCell(0,5,$texto,0,&#8221;L&#8221;,0);</p>
<p>$pdf-&gt;Output();</p>
<p>?&gt;</p></blockquote>
<p>Podemos notar que o c&oacute;digo sofreu tr&ecirc;s altera&ccedil;&otilde;es:</p>
<p>Declaramos  $pdf = new PDF() ao inv&eacute;s de $pdf = new FPDF().</p>
<p>Acrescentamos as linhas : $pdf-&gt;AliasNbPages( &#8216;{total}&#8217; ); e $pdf-&gt;AddPage();</p>
<p>O c&oacute;digo que montava o cabe&ccedil;alho foi para dentro da fun&ccedil;&atilde;o Header, saindo do corpo do documento.</p>
<h2>Considera&ccedil;&otilde;es Finais</h2>
<p>Antes de finalizar &eacute; bom ressaltar alguns itens:</p>
<p>- N&atilde;o esquecer de informar a fonte antes de imprimir qualquer texto. Caso contr&aacute;rio a p&aacute;gina ou o texto anterior ao primeiro SetFont n&atilde;o aparecer&aacute; no documento;</p>
<p>- Setar sempre a posi&ccedil;&atilde;o Y primeiro. Primeiro Y depois X, e n&atilde;o o contr&aacute;rio.</p>
<p>- Se for necess&aacute;rio colocar algum texto no final de cada p&aacute;gina, como por exemplo a soma total de um campo, basta usar a fun&ccedil;&atilde;o GetY &eacute; para determinar a posi&ccedil;&atilde;o da impress&atilde;o dentro do documento. Isso pode ser verificado dentro de um loop <em>for </em>ou <em>while</em>. Por exemplo, o c&oacute;digo abaixo imprime o n&uacute;mero de linha de 1 a 150. Ao chegar no final da p&aacute;gina (ou seja, a 27cm) ele escreve a palavra <strong>total</strong> e continua a impress&atilde;o da linha seguinte na pr&oacute;xima p&aacute;gina:</p>
<blockquote><p>for($i=1;$i&lt;=150;$i++)<br />
{</p>
<p>if ($pdf-&gt;GetY() &gt;= 270)<br />
{<br />
$pdf-&gt;Cell(0,5,&#8221;total: &#8220;,0,0);<br />
$pdf-&gt;AddPage();<br />
$pdf-&gt;Cell(0,5,&#8221;Line $i &#8211; &#8221; . $pdf-&gt;GetY() ,0,1);<br />
}<br />
else<br />
{<br />
$pdf-&gt;Cell(0,5,&#8221;Line $i &#8211; &#8221; . $pdf-&gt;GetY() ,0,1);<br />
}</p>
<p>}</p></blockquote>
<h2>Concluindo</h2>
<p>Vimos que criar arquivos PDF pode ser uma tarefa bem simples. Claro que documentos ou relat&oacute;rios mais bem elaborados e/ou complexos podem dar um pouco mais de trabalho, mas o resultado final fica com aspecto mais profissional e elegante.<br />
<h3>Leia tamb&eacute;m</h3>
<ul class="related_post">
<li><a href="http://fdweb.com.br/curso-gratuito-de-php-em-portugues/" title="Curso gratuito de PHP em Portugu&ecirc;s">Curso gratuito de PHP em Portugu&ecirc;s (0)</a></li>
<li><a href="http://fdweb.com.br/trabalhando-com-ajax-no-php/" title="Trabalhando com Ajax no PHP">Trabalhando com Ajax no PHP (4)</a></li>
<li><a href="http://fdweb.com.br/criando-arquivos-zip-no-php-com-a-ziplib/" title="Criando arquivos ZIP no PHP com a ZIPlib">Criando arquivos ZIP no PHP com a ZIPlib (19)</a></li>
<li><a href="http://fdweb.com.br/acessando-banco-de-dados-usando-php-e-adodb/" title="Acessando banco de dados usando PHP e ADODB">Acessando banco de dados usando PHP e ADODB (6)</a></li>
</ul>
<p>

Artigo publicado no site <a href="http://fdweb.com.br">FD Web</a></p>
<p><a href="http://fdweb.com.br/gerando-arquivos-pdf-com-php/">Gerando arquivos PDF com PHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fdweb.com.br/gerando-arquivos-pdf-com-php/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		<feedburner:origLink>http://fdweb.com.br/gerando-arquivos-pdf-com-php/</feedburner:origLink></item>
	</channel>
</rss><!-- Loaded originally in 0.89 seconds (2009-07-20, 10:51:44). --><!-- Loaded from cache in 0.0036 seconds by 1 Blog Cacher - http://1blogcacher.com/ - (2009-07-20, 11:34:50) -->
