<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Fabian André Gehrke</title>
	<atom:link href="http://fabiangehrke.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://fabiangehrke.com.br</link>
	<description>SharePoint no dia-a-dia</description>
	<lastBuildDate>Mon, 14 May 2012 13:11:13 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='fabiangehrke.com.br' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Fabian André Gehrke</title>
		<link>http://fabiangehrke.com.br</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://fabiangehrke.com.br/osd.xml" title="Fabian André Gehrke" />
	<atom:link rel='hub' href='http://fabiangehrke.com.br/?pushpress=hub'/>
		<item>
		<title>Entendendo os Ambientes Envolvidos em Projetos SharePoint</title>
		<link>http://fabiangehrke.com.br/2012/05/13/entendendo-os-ambientes-envolvidos-em-desenvolvimento-de-projetos-sharepoint/</link>
		<comments>http://fabiangehrke.com.br/2012/05/13/entendendo-os-ambientes-envolvidos-em-desenvolvimento-de-projetos-sharepoint/#comments</comments>
		<pubDate>Mon, 14 May 2012 00:34:25 +0000</pubDate>
		<dc:creator>Fabian André Gehrke</dc:creator>
				<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false">https://fgehrke.wordpress.com/?p=599</guid>
		<description><![CDATA[É muito comum existirem dúvidas sobre a estrutura de máquinas e ambientes necessárias para o desenvolvimento de projetos SharePoint. Principalmente como que os desenvolvedores devem trabalhar, se precisa instalar Visual Studio na máquina local ou não, se dá para utilizar WTS, entre outras dúvidas. Neste post vou falar sobre o que eu acho que seria [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=599&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">É muito comum existirem dúvidas sobre a estrutura de máquinas e ambientes necessárias para o desenvolvimento de projetos SharePoint. Principalmente como que os desenvolvedores devem trabalhar, se precisa instalar Visual Studio na máquina local ou não, se dá para utilizar WTS, entre outras dúvidas.</p>
<p align="justify">Neste post vou falar sobre o que eu acho que seria o ambiente ideal de desenvolvimento de projetos SharePoint, conforme o cenário, ele pode ser alterado sem problemas. O objetivo principal é mais uma orientação inicial do que um manual de como montar o ambiente.</p>
<p align="justify"><em>Este post faz parte de uma série de posts sobre entendimento do SharePoint 2010, acesse o post principal para ver os outros assuntos: </em><a href="http://fabiangehrke.com.br/2012/03/20/entendendo-o-sharepoint-2010/"><em>Entendendo o SharePoint 2010</em></a></p>
<p><span id="more-599"></span>
<p align="justify">No site da Microsof tem um link bem interessante <a href="http://msdn.microsoft.com/en-us/library/ee554869.aspx">Setting Up the Development Environment for SharePoint 2010 on Windows Vista, Windows 7, and Windows Server 2008</a> que trata sobre parte do conteúdo que vou falar aqui, recomendo dar uma olhada.</p>
<p align="justify">Para o desenvolvimento de projetos SharePoint visualizo 4 ambientes distintos: ambiente de desenvolvimento individual, ambiente de integração, ambiente de homologação e ambiente de produção. Conforme o tamanho do projeto ou outros requisitos, nem todos os ambiente são necessários. Projetos pequenos podem ser feito com menos servidores e projetos maiores podem necessitar de outros ambientes.</p>
<p align="justify">A arquitetura física dos servidores não é algo importante para este artigo, coloquei os servidores apenas para explicar os ambiente.</p>
<p align="justify">&nbsp;</p>
<p align="justify"><font size="5"><strong>Ambiente de Desenvolvimento Individual</strong></font></p>
<p align="justify"><strong><font size="3"></font></strong>&nbsp;</p>
<p align="justify">Este é o ambiente onde um desenvolvedor irá trabalhar, por isso ele vai precisar de pelo menos um SharePoint, Visual Studio, Office, SQL Server, etcs. A questão é onde colocar isso tudo. </p>
<p align="justify">Prefiro a utilização de máquinas virtuais, instalar o Windows Server 2008 R2 (ou esperar o Windows 8) para virtualizar todos os ambientes necessários. Digo isso porque se instalar o SharePoint no host do computador do desenvolvedor, conforme os projetos o ambiente poderá ser comprometido, ainda mais se forem projetos em versões direrentes do SharePoint como SharePoint 2007, WSS 3.0, SharePoint Foundation. Se a equipe trabalhar apenas com um projeto ou o cliente for interno e não consultoria onde existem vários projetos para vários clientes, considere instalar tudo no computador físico mesmo ao invés de virtualizar.</p>
<p align="justify">Independente da escolha de virtualizar ou não, é necessário ter o Visual Studio 2010 na mesma máquina do SharePoint, sem isso a experiência de desenvolvimento, leia aqui produditivade, será comprometida. </p>
<p align="justify">Cada máquina virtual poderá conter a farm completa do SharePoint com o SQL Server, SharePoint, Visual Studio. As ferramentas do Office e SharePoint Designer podem ficar na máquina do desenvolvedor sem problema, já que elas não são necessárias no ambiente e assim economizam espaço em disco e tempo de instalação. </p>
<p align="justify">O SQL Server pode ficar dentro da máquina virtual, ou se preferirem no computador do desenvolvedor ou até em um servidor de bando de dados de desenvolvimento. Eu prefiro que fique na máquina virtual do desenvolvedor, mesmo ocupando um pouco mais de recurso da máquina, assim ele pode ter versões diferentes, conforme o projeto. Não é requisito o banco estar na mesma versão do ambiente de produção, mas acredito que quanto mais próximo melhor.</p>
<p align="justify">Outra opção é utilizar o WTS (Windows Terminal Services), mas não gosto dela nem um pouco. Com 2 desenvolvedores na mesma máquina serão comuns os problemas de precisar reiniciar o IIS e afetar o debug ou outras atividades do outro desenvolvedor, imagina colocar 4, 6 ou 10 –pessoas desenvolvendo na mesma máquina. É IIS reset a toda hora.</p>
<p align="justify">O AD pode ser o AD da empresa, utilizando uma OU separada, ou se necessário, criar um AD específico para o projeto. Isso seria necessário onde integrações com o perfil de usuários mais customizadas e complexas fossem necessárias.</p>
<p align="justify">É neste ambiente que o desenvolvedor vai desenvolver e testar a sua unidade, seja teste manual ou teste automatizado. Mas é muito importante ele garantir que a unidade dele funcione antes de liberar.</p>
<p align="justify">A imagem 01 detalha o ambiente de desenvolvimento, onde existe o computador de cada desenvolvedor e esse virtualiza tudo que necessário.</p>
<p><img style="float:none;margin-left:auto;display:block;margin-right:auto;" src="https://public.sn2.livefilestore.com/y1pFAOGdWSGk9JVd9EZjGYudTr7MMCuUc7ZUcggbjZUMXgO-BSwcY7mFfCwgZdM4fS_algcXm0WcsIvZJnqwOgsBA/AmbienteDesenvolvimento.png?psid=1" width="600" height="366"></p>
<p align="center"><em>Imagem 01: Ambiente de desenvolvimento individual</em></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><font size="5"><strong>Ambiente de Integração</strong></font></p>
<p align="justify"><font size="3"></font>&nbsp;</p>
<p align="justify">Como cada desenvolvedor trabalha na sua máquina, é importante ter um ambiente para que o trabalho de todos seja testado em conjunto. Cada unidade foi festada individualmente, agora é hora de colocar tudo junto e testar para ver se continuam funcionando. Não é difícil aparecerem diversos erros devido a alterações de configurações do ambiente, campos, tipos de conteúdo, ou outras alterações feitas em uma unidade e que uma outra unidade esperava esses valores de forma diferente. Por isso este ambiente é tão importante. </p>
<p align="justify">A presença do Visual Studio nesse ambiente pode ser necessária para depurar os erros ou garantiar algum comportamento.</p>
<p align="justify">A implantação das unidades dos desenvolvedores poder ser feita utilizando integração contínua, ou seja, cada vez que um desenvolvedor faz um check in de fonte (liberou a sua unidade) o TFS (Team Foundation Server – ferramenta da Microsoft para gerenciamento de fontes e ciclo de vida de aplicativos) baixa e compila todos os fontes no servidor de integração e executa os testes automaticamente. Qualquer erro que acontecer os desenvolvedores serã avisados e corrigem o erro o mais rápido possível, geralmente quem fez o check in que gerou o erro. Esta automatização é opcional, a outra forma é fazer o deploy manual toda vez que a unidade estiver pronta, mas o tempo para executar o mesmo procedimento será muito maior.</p>
<p align="justify">A imagem 02 mostra uma ideia do ambiente de integração, lembrando que o número de sevidores e a arquitetura deles pode varia conforme as necessidades do projeto.</p>
<p><img style="float:none;margin-left:auto;display:block;margin-right:auto;" src="https://public.sn2.livefilestore.com/y1pFAOGdWSGk9Lg7TDgLc5aU0aETqe02wcHK63EIvLZEgPfJo_U5hg34VVOYMr_V2veEtLbXW04g2m_Wh3OOjX1SQ/AmbienteIntegracao.png?psid=1" width="400" height="226"></p>
<p align="center"><em>Imagem 02: Ambiente de integração</em></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><font size="5"><strong>Ambiente de Homologação</strong></font></p>
<p><strong><font size="3"></font></strong>&nbsp;</p>
<p align="justify">O ambiente de homologação é o mais comum existir em projetos de software, geralmente é onde o cliente faz o aceite de tudo o que foi criado. Neste ambiente não existe nenhuma ferramante de desenvolvimento e ele precisa ser o mais similar possível ao ambiente de produção, para evitar problemas na hora de implatar. Se o ambiente de homologação for muito diferente do de produção, erros arquiteturais de servidores e serviços não serão pegos, além de outros erros que podem acontecer. Por isso reforço, quanto mais similar ao ambiente de produção melhor.</p>
<p><img style="float:none;margin-left:auto;display:block;margin-right:auto;" src="https://public.sn2.livefilestore.com/y1pDTAIkXAD1IqW2mCZKkEr1jo_KfqrK5j4HxVWdhHURaWIuty6g6a4QwFtxioGEs6bqCXfTB8CLVdNlhAMcgNfkQ/AmbienteHomologacao.png?psid=1" width="400" height="160"></p>
<p align="center"><em>Imagem 03: Ambiente de homologação</em></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong><font size="5">Ambiente de Produção</font></strong></p>
<p align="justify"><font size="3"></font>&nbsp;</p>
<p align="justify">Este é, sem questão alguma, o ambiente mais importante de todos. Aqui os serviços não podem parar e o site tem que estar disponível para o usuário sempre. Ferramentas de desenvolvimento não são bem vindas aqui, apenas em exceções muito urgente e que não podem ser resolvidas sem a instalação das ferramentas. </p>
<p align="justify">Sempre que for instalar alguma unidade no ambiente, lembre de avisar os usuários de possíveis paradas no serviço e dê preferência em fazer fora do horário.</p>
<p><img style="float:none;margin-left:auto;display:block;margin-right:auto;" src="https://public.sn2.livefilestore.com/y1pDTAIkXAD1IpRIlcRL-cKuqhayIZM9H_cybKnxrGrAvKRI4avAr2Ix9cQf2hg_pekLkkOBEJH2bckUEAJTsaTYQ/AmbienteProducao.png?psid=1" width="360" height="178"></p>
<p align="center">Imagem 04: Ambiente de produção</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fgehrke.wordpress.com/599/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fgehrke.wordpress.com/599/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fgehrke.wordpress.com/599/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fgehrke.wordpress.com/599/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fgehrke.wordpress.com/599/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fgehrke.wordpress.com/599/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fgehrke.wordpress.com/599/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fgehrke.wordpress.com/599/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fgehrke.wordpress.com/599/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fgehrke.wordpress.com/599/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fgehrke.wordpress.com/599/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fgehrke.wordpress.com/599/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fgehrke.wordpress.com/599/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fgehrke.wordpress.com/599/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=599&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiangehrke.com.br/2012/05/13/entendendo-os-ambientes-envolvidos-em-desenvolvimento-de-projetos-sharepoint/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/43a149af1253deaba3d17779f3ff640a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fgehrke</media:title>
		</media:content>

		<media:content url="https://public.sn2.livefilestore.com/y1pFAOGdWSGk9JVd9EZjGYudTr7MMCuUc7ZUcggbjZUMXgO-BSwcY7mFfCwgZdM4fS_algcXm0WcsIvZJnqwOgsBA/AmbienteDesenvolvimento.png?psid=1" medium="image" />

		<media:content url="https://public.sn2.livefilestore.com/y1pFAOGdWSGk9Lg7TDgLc5aU0aETqe02wcHK63EIvLZEgPfJo_U5hg34VVOYMr_V2veEtLbXW04g2m_Wh3OOjX1SQ/AmbienteIntegracao.png?psid=1" medium="image" />

		<media:content url="https://public.sn2.livefilestore.com/y1pDTAIkXAD1IqW2mCZKkEr1jo_KfqrK5j4HxVWdhHURaWIuty6g6a4QwFtxioGEs6bqCXfTB8CLVdNlhAMcgNfkQ/AmbienteHomologacao.png?psid=1" medium="image" />

		<media:content url="https://public.sn2.livefilestore.com/y1pDTAIkXAD1IpRIlcRL-cKuqhayIZM9H_cybKnxrGrAvKRI4avAr2Ix9cQf2hg_pekLkkOBEJH2bckUEAJTsaTYQ/AmbienteProducao.png?psid=1" medium="image" />
	</item>
		<item>
		<title>MS Techday Botucatu&#8211;12/05/2012&#8211;Como foi</title>
		<link>http://fabiangehrke.com.br/2012/05/13/ms-techday-botucatu12052012como-foi/</link>
		<comments>http://fabiangehrke.com.br/2012/05/13/ms-techday-botucatu12052012como-foi/#comments</comments>
		<pubDate>Sun, 13 May 2012 22:49:06 +0000</pubDate>
		<dc:creator>Fabian André Gehrke</dc:creator>
				<category><![CDATA[Eventos]]></category>

		<guid isPermaLink="false">https://fgehrke.wordpress.com/?p=596</guid>
		<description><![CDATA[No dia 12/05/2012 aconteceu mais uma edição do MS Techday, dessa vez em Botucatu. Foram a ao evento palestrar o Daniel Donda, Diego Nogare, Lucas Romão e eu, todos MVPs. Antes do evento começar veio o pessoal da rádio e fez uma entrevista com o Nogare, foi muito legal pelo nível de interesse e das [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=596&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">No dia 12/05/2012 aconteceu mais uma edição do MS Techday, dessa vez em Botucatu. Foram a ao evento palestrar o Daniel Donda, Diego Nogare, Lucas Romão e eu, todos MVPs. </p>
<p align="justify">Antes do evento começar veio o pessoal da rádio e fez uma entrevista com o Nogare, foi muito legal pelo nível de interesse e das perguntas que fizeram, a rádio chega a ter uma audiência de 150.000 pessoas.</p>
<p align="justify">Os números do evento foram melhores do que esperávamos, o sábado estava chuvoso e um pouco frio, já que Botucatu é a segunda cidade mais alta de São Paulo, mas mesmo assim foram 160 pessoas participar do evento.</p>
<p align="justify">Site oficial do evento: <a href="http://botucatu.mstechday.com.br/">MS Techday Botucatu</a>.</p>
<p><span id="more-596"></span>
<p align="justify">A primeira palestra foi do Daniel Donda, sobre Windows 8 e Windows Server 2012. A próxima foi a minha que falei sobre SharePoint para Sites Internet. Após o almoço o Diego Nogare falou sobre BI e logo mais veio o Lucas Romão falando de Windows Azure.</p>
<p align="justify">As palestras foram sensacionais, é incrível como a já assisti algumas palestras várias vezes mas sempre tem novidades, muito bom o empenho dos palestrantes em trazer sempre novidades.</p>
<p align="justify">O pessoal de Botucatu foi muito receptivo e tratou a gente muito bem, gostei muito da recepção. Espero poder voltar para para outros eventos.</p>
<p><img src="https://hrn9qw.sn2.livefilestore.com/y1p4Tkj88p3T-5LV86TyoczK7BvLHvaTEoTjVtZIanl4CnSGKbA003aVWGeAEvHhBnzpI77oViGK1luVjNLDy7iHvu1sICAlKzD/380313_235968073176323_100002893973102_383519_446784837_n.jpg?psid=1" width="600" height="267"></p>
<p align="center"><em>Imagem 01: Pessoal do evento no encerramento</em></p>
<p>&nbsp;</p>
<p><img src="https://public.sn2.livefilestore.com/y1pmye4drGApPdKKjG6C8byYLXb3Oa7ybHntkrmMlT-5hxkrIsWqn5ORgX9e4QUKwiTHHbKv3KBOTcKoKlq20OtoA/525505_455022874512524_100000144475532_1847622_1980191111_n.jpg?psid=1" width="600" height="450"></p>
<p align="center"><em>Imagem 02: Eu palestrando sobre SharePoint</em></p>
<p>&nbsp;</p>
<div align="center">
<div id="__ss_12898956" style="width:425px;"><strong><a title="MS Techday Botucatu - SharePoint for Internet Sites" href="http://www.slideshare.net/fgehrke/ms-techday-botucatu-sharepoint-for-internet-sites" target="_blank">MS Techday Botucatu &#8211; SharePoint for Internet Sites</a></strong> <iframe src='http://www.slideshare.net/slideshow/embed_code/12898956' width='425' height='348' scrolling='no'></iframe>
<div style="padding:5px 0 12px;">View more <a href="http://www.slideshare.net/thecroaker/death-by-powerpoint" target="_blank">PowerPoint</a> from <a href="http://www.slideshare.net/fgehrke" target="_blank">Fabian Gehrke</a> </div>
</div>
</div>
<p>&nbsp;</p>
<p><a href="https://skydrive.live.com/?sc=photos&amp;cid=4ec733696e21204d#cid=4EC733696E21204D&amp;id=4EC733696E21204D%2113569&amp;sc=photos">Link das fotos</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fgehrke.wordpress.com/596/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fgehrke.wordpress.com/596/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fgehrke.wordpress.com/596/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fgehrke.wordpress.com/596/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fgehrke.wordpress.com/596/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fgehrke.wordpress.com/596/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fgehrke.wordpress.com/596/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fgehrke.wordpress.com/596/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fgehrke.wordpress.com/596/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fgehrke.wordpress.com/596/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fgehrke.wordpress.com/596/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fgehrke.wordpress.com/596/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fgehrke.wordpress.com/596/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fgehrke.wordpress.com/596/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=596&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiangehrke.com.br/2012/05/13/ms-techday-botucatu12052012como-foi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/43a149af1253deaba3d17779f3ff640a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fgehrke</media:title>
		</media:content>

		<media:content url="https://hrn9qw.sn2.livefilestore.com/y1p4Tkj88p3T-5LV86TyoczK7BvLHvaTEoTjVtZIanl4CnSGKbA003aVWGeAEvHhBnzpI77oViGK1luVjNLDy7iHvu1sICAlKzD/380313_235968073176323_100002893973102_383519_446784837_n.jpg?psid=1" medium="image" />

		<media:content url="https://public.sn2.livefilestore.com/y1pmye4drGApPdKKjG6C8byYLXb3Oa7ybHntkrmMlT-5hxkrIsWqn5ORgX9e4QUKwiTHHbKv3KBOTcKoKlq20OtoA/525505_455022874512524_100000144475532_1847622_1980191111_n.jpg?psid=1" medium="image" />
	</item>
		<item>
		<title>Galeria de C&#243;digo do MSDN</title>
		<link>http://fabiangehrke.com.br/2012/05/04/galeria-de-cdigo-do-msdn/</link>
		<comments>http://fabiangehrke.com.br/2012/05/04/galeria-de-cdigo-do-msdn/#comments</comments>
		<pubDate>Fri, 04 May 2012 14:42:22 +0000</pubDate>
		<dc:creator>Fabian André Gehrke</dc:creator>
				<category><![CDATA[Dicas]]></category>

		<guid isPermaLink="false">https://fgehrke.wordpress.com/?p=592</guid>
		<description><![CDATA[A Microsoft, no site do MSDN, disponibiliza vários trechos de código através da Galeria de Código, a parte boa é que é livre para podermos contribuir com códigos de exemplo. Existem códigos de várias tecnologias como Windows Azure, Office, Silverlight, Windows 8 e claro que SharePoint, entre outros. Participem e contribuam!<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=592&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">A Microsoft, no site do MSDN, disponibiliza vários trechos de código através da <a href="http://code.msdn.microsoft.com/">Galeria de Código</a>, a parte boa é que é livre para podermos contribuir com códigos de exemplo. Existem códigos de várias tecnologias como Windows Azure, Office, Silverlight, Windows 8 e claro que SharePoint, entre outros.</p>
<p align="justify">Participem e contribuam!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fgehrke.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fgehrke.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fgehrke.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fgehrke.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fgehrke.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fgehrke.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fgehrke.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fgehrke.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fgehrke.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fgehrke.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fgehrke.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fgehrke.wordpress.com/592/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fgehrke.wordpress.com/592/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fgehrke.wordpress.com/592/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=592&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiangehrke.com.br/2012/05/04/galeria-de-cdigo-do-msdn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/43a149af1253deaba3d17779f3ff640a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fgehrke</media:title>
		</media:content>
	</item>
		<item>
		<title>Word N&#227;o Consegue Salvar Documentos no SharePoint</title>
		<link>http://fabiangehrke.com.br/2012/05/04/word-no-consegue-salvar-documentos-no-sharepoint/</link>
		<comments>http://fabiangehrke.com.br/2012/05/04/word-no-consegue-salvar-documentos-no-sharepoint/#comments</comments>
		<pubDate>Fri, 04 May 2012 14:16:39 +0000</pubDate>
		<dc:creator>Fabian André Gehrke</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Erros e soluções]]></category>

		<guid isPermaLink="false">https://fgehrke.wordpress.com/?p=589</guid>
		<description><![CDATA[Em algumas máquinas da rede o Word não estava conseguindo salvar documentos diretamente no SharePoint. Ao clicar em novo documento no SharePoint o Word era aberto e ao salvar não estava disponível o diretório do SharePoint, obrigando o usuário a salvar localmente e subir o documento manualmente. Neste post vou mostrar algumas opções de como [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=589&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">Em algumas máquinas da rede o Word não estava conseguindo salvar documentos diretamente no SharePoint. Ao clicar em novo documento no SharePoint o Word era aberto e ao salvar não estava disponível o diretório do SharePoint, obrigando o usuário a salvar localmente e subir o documento manualmente.</p>
<p align="justify">Neste post vou mostrar algumas opções de como resolver o problema.</p>
<p><span id="more-589"></span>
<p align="justify">O responsável por fazer com que esse recurso funciona é um serviço do Windows chamado WebClient, algumas formas para verificar e resolver o problema:</p>
<ol>
<li>
<div align="justify">Verifique se o serviço do Windows chamado WebClient ou Cliente de Web está ativado no computador do usuário, se não estiver ative-o e configure para iniciar automaticamente;</div>
</li>
<li>
<div align="justify">Se o serviço não existir, pode ser que o seu Windows 7 seja das edições Home ou fale com o administrador da rede pra verificar se não existe nenhuma GPO para desabilitar o serviço;</div>
</li>
<li>
<div align="justify">Em algumas situações pode ser que o serviço não exista no Windows, para isso baixe e instale o update do <a href="http://www.microsoft.com/downloads/details.aspx?familyid=17c36612-632e-4c04-9382-987622ed1d64&amp;displaylang=pt-br">WebClient</a> e tente novamente.</div>
</li>
</ol>
<p align="justify">Com os passos acima o comportamento deverá ser normalizado.</p>
<p align="justify">Post publicado na TechNet Wiki: <a href="http://social.technet.microsoft.com/wiki/pt-br/contents/articles/10473.microsoft-office-nao-consegue-salvar-documentos-no-sharepoint.aspx">Microsoft Office Não Consegue Salvar Documentos no SharePoint</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fgehrke.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fgehrke.wordpress.com/589/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fgehrke.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fgehrke.wordpress.com/589/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fgehrke.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fgehrke.wordpress.com/589/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fgehrke.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fgehrke.wordpress.com/589/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fgehrke.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fgehrke.wordpress.com/589/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fgehrke.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fgehrke.wordpress.com/589/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fgehrke.wordpress.com/589/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fgehrke.wordpress.com/589/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=589&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiangehrke.com.br/2012/05/04/word-no-consegue-salvar-documentos-no-sharepoint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/43a149af1253deaba3d17779f3ff640a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fgehrke</media:title>
		</media:content>
	</item>
		<item>
		<title>Trabalhando com Dados do SharePoint Online com o Web Service Lists.ASMX</title>
		<link>http://fabiangehrke.com.br/2012/04/18/trabalhando-com-dados-do-sharepoint-online-com-o-web-service-lists-asmx/</link>
		<comments>http://fabiangehrke.com.br/2012/04/18/trabalhando-com-dados-do-sharepoint-online-com-o-web-service-lists-asmx/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 18:02:17 +0000</pubDate>
		<dc:creator>Fabian André Gehrke</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[SharePoint Online]]></category>

		<guid isPermaLink="false">https://fgehrke.wordpress.com/?p=587</guid>
		<description><![CDATA[Trabalhar com objetos do SharePoint Online possuem um item diferente do SharePoint OnPremise, como já tratado no post Trabalhando com Dados do SharePoint Online com o .NET Client Object Model, que é a autenticação. Neste post vou mostrar como acessar os dados do SharePont Online através do web service Lists.asmx. Para trabalhar com dados do [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=587&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">Trabalhar com objetos do SharePoint Online possuem um item diferente do SharePoint OnPremise, como já tratado no post <a href="http://fabiangehrke.com.br/2012/04/18/trabalhando-com-dados-do-sharepoint-online-com-o-net-client-object-model/">Trabalhando com Dados do SharePoint Online com o .NET Client Object Model</a>, que é a autenticação. </p>
<p align="justify">Neste post vou mostrar como acessar os dados do SharePont Online através do web service <em>Lists.asmx</em>.</p>
<p><span id="more-587"></span>
<p>Para trabalhar com dados do SharePoint Online o desenvolvedor deve prestar atençãoa&nbsp; dois pontos:</p>
<ol>
<li>
<div align="justify">A classe <a href="http://code.msdn.microsoft.com/Remote-Authentication-in-b7b6f43c/sourcecode?fileId=21439&amp;pathId=1168218626">ClaimClientContext</a> retorna um ClientContext ao invés de Lists, como seria experado ao se trabalhar com o <em>Lists.asmx</em>;</div>
</li>
<li>
<div align="justify">A referência ao serviço <a href="https://sites/_vti_bin/Lists.asmx">https://sites/_vti_bin/Lists.asmx</a> deve ser feita na opção avançada da inclusão da referência ao serviço, lá em adicionar referência web. Se for adicionada como serviço não irá funcionar da forma descrita neste post.</div>
</li>
</ol>
<p align="justify">O código completo deste projeto está no GitHub <a href="https://github.com/fgehrke/SharePoint-Demos">SharePoint-Demos</a> e contém diversos outros exemplo. O nome do projeto é ListASMXDemo.</p>
<p align="justify">Algumas alterações foram necessárias na classe ClaimClientContext, como alterar o retorno do método <em>GetAuthenticatedContext</em> para retornar <em>Lists</em>, conforme a listagem 01, e alterar a regra do método <em>GetAuthenticatedContext</em> (listagem 02) para trabalhar <em>Lists</em> ao invés de <em>ClientContext</em>.</p>
<p align="justify">Neste post vou mostrar apenas a implementação da classe RepositorioTarefas, para ver as demais acesse os fontes do projeto.
<p><font face="Courier New">public static SharePointLists.Lists GetAuthenticatedContext(string targetSiteUrl)<br />{<br />&nbsp;&nbsp;&nbsp; return (GetAuthenticatedContext(targetSiteUrl, 0, 0));<br />}</font></p>
<p align="center"><em>Listagem 01: Método GetAuthenticatedContext alterado</em></p>
<p>&nbsp;</p>
<p><font face="Courier New">/// &lt;summary&gt; <br />/// This method will return a ClientContext object with the authentication cookie set. <br />/// The ClientContext should be disposed of as any other IDisposable <br />/// &lt;/summary&gt; <br />/// &lt;param name=&#8221;targetSiteUrl&#8221;&gt;&lt;/param&gt; <br />/// &lt;returns&gt;&lt;/returns&gt; <br />public static SharePointLists.Lists GetAuthenticatedContext(string targetSiteUrl, int popUpWidth, int popUpHeight)<br />{<br />&nbsp;&nbsp;&nbsp; CookieCollection cookies = null;<br />&nbsp;&nbsp;&nbsp; cookies = ClaimClientContext.GetAuthenticatedCookies(targetSiteUrl, popUpWidth, popUpHeight);<br />&nbsp;&nbsp;&nbsp; if (cookies == null) return null;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; SharePointLists.Lists contexto = new SharePointLists.Lists();</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; try<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contexto.CookieContainer = new CookieContainer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (Cookie cookie in cookies)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contexto.CookieContainer.Add(cookie);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; catch<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (contexto != null) contexto.Dispose();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw;<br />&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; return contexto;<br />}<br /></font></p>
<p align="center"><em>Listagem 02: Método GetAuthenticatedContext alterado</em></p>
<p><font face="Courier New"></font>&nbsp;</p>
<p align="justify">Com a classe ClaimClientContext devidamente alterada, agora vamos implementar a classe de repositório de tarefas. A listagem 03 mostra as referências, classe e construtor padrão da classe.</p>
<p><font face="Courier New">using System;<br />using System.Collections.Generic;<br />using System.IO;<br />using System.Linq;<br />using System.Net;<br />using System.ServiceModel;<br />using System.Text;<br />using System.Xml;<br />using System.Xml.Linq;<br />using ListsASMXDemo.Entidades;<br />using ListsASMXDemo.Helpers;</font></p>
<p><font face="Courier New">namespace ListsASMXDemo<br />{<br />&nbsp;&nbsp;&nbsp; public class RepositorioTarefas<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private SharePointLists.Lists Contexto;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public RepositorioTarefas()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Contexto = ClaimClientContext.GetAuthenticatedContext(Constants.ENDRECO_SITE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Contexto.Url = Constants.ENDRECO_SITE + &#8220;/_vti_bin/Lists.asmx&#8221;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p align="center"><em>Listagem 03: Campos e construtor da classe RepositorioTarefas</em></p>
<p>&nbsp;</p>
<p align="justify">O método ObterTodos retorna todas as tarefas cadastradas no SharePoint, veja como os parâmetros são montados para buscar os dados. No exemplo da listagem 04 todos os campos são retornado, mas poderam ser apenas algunas campos como id e título, por exemplo. Como o retorno do método é um XmlNode, quanto menos informação inútil eu retornar, melhor será.</p>
<p><font face="Courier New">public List&lt;Tarefa&gt; ObterTodos()<br /> {<br />&nbsp;&nbsp;&nbsp;&nbsp; XmlDocument xmlDoc = new System.Xml.XmlDocument();</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element, &#8220;Query&#8221;, &#8220;&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element, &#8220;ViewFields&#8221;, &#8220;&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; XmlNode ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.Element, &#8220;QueryOptions&#8221;, &#8220;&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; ndQueryOptions.InnerXml = &#8220;&lt;IncludeMandatoryColumns&gt;FALSE&lt;/IncludeMandatoryColumns&gt;&#8221;;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; XmlNode ndListItems = Contexto.GetListItems(&#8220;Tarefas&#8221;, null, ndQuery, ndViewFields, null, ndQueryOptions, null);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; return TarefaConverterHelper.ItensParaTarefas(ndListItems);<br /> }</font></p>
<p align="center"><em>Listagem 04: Método ObterTodos</em></p>
<p>&nbsp;</p>
<p align="justify">O método ObterPorID retorna apenas a tarefa conforme o id passado por parâmetro. Usa CAML para fazer o filtro, conforme listagem&nbsp; 05.</p>
<p><font face="Courier New">public Tarefa ObterPorID(int id)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; XmlDocument xmlDoc = new System.Xml.XmlDocument();</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element, &#8220;Query&#8221;, &#8220;&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; XmlNode ndViewFields =&nbsp; xmlDoc.CreateNode(XmlNodeType.Element, &#8220;ViewFields&#8221;, &#8220;&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; XmlNode ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.Element, &#8220;QueryOptions&#8221;, &#8220;&#8221;);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; ndQueryOptions.InnerXml = &#8220;&lt;IncludeMandatoryColumns&gt;FALSE&lt;/IncludeMandatoryColumns&gt;&#8221;;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; ndQuery.InnerXml = &#8220;&lt;Where&gt;&lt;Eq&gt;&lt;FieldRef Name=&#8217;ID&#8217;/&gt;&#8221; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;&lt;Value Type=&#8217;Number&#8217;&gt;&#8221; + id.ToString() + &#8220;&lt;/Value&gt;&lt;/Eq&gt;&lt;/Where&gt;&#8221;;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; XmlNode ndListItems = Contexto.GetListItems(&#8220;Tarefas&#8221;, null, ndQuery, ndViewFields, null, ndQueryOptions, null);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; return TarefaConverterHelper.ItensParaTarefas(ndListItems)[0];<br />}</font></p>
<p align="center"><em>Listagem 05: Método ObterPorID</em></p>
<p>&nbsp;</p>
<p align="justify">O método para buscar pelo título da tarefa é muito parecido com o de obter pelo id, a única coisa que muda é a query CAML que é passada para o método GetListItems, conforme a listagem 06.</p>
<p>&nbsp;<font face="Courier New">public List&lt;Tarefa&gt; ObterPorFiltro(string titulo)<br /> {<br />&nbsp;&nbsp;&nbsp;&nbsp; XmlDocument xmlDoc = new System.Xml.XmlDocument();</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element, &#8220;Query&#8221;, &#8220;&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element, &#8220;ViewFields&#8221;, &#8220;&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; XmlNode ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.Element, &#8220;QueryOptions&#8221;, &#8220;&#8221;);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; ndQueryOptions.InnerXml = &#8220;&lt;IncludeMandatoryColumns&gt;FALSE&lt;/IncludeMandatoryColumns&gt;&#8221;;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; ndQuery.InnerXml = &#8220;&lt;Where&gt;&lt;Contains&gt;&lt;FieldRef Name=&#8217;Title&#8217;/&gt;&#8221; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;&lt;Value Type=&#8217;Text&#8217;&gt;&#8221; + titulo + &#8220;&lt;/Value&gt;&lt;/Contains&gt;&lt;/Where&gt;&#8221;;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; XmlNode ndListItems = Contexto.GetListItems(&#8220;Tarefas&#8221;, null, ndQuery, ndViewFields, null, ndQueryOptions, null);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; return TarefaConverterHelper.ItensParaTarefas(ndListItems);<br /> }</font></p>
<p align="center"><em>Listagem 06: Método ObterPorFiltros</em></p>
<p>&nbsp;</p>
<p align="justify">Os métodos Salvar e Excluir, nas listagems 07 e 08 respectivamente, são idênticos, neles um parâmetro Method com o cmd adequado são passados para o método UpdateListItems. Esse método pode receber inclusão, edição ou exclusão de diversmos itens ao mesmo tempo. Para isso é necessário montar o XML e informar todos os dados.</p>
<p>&nbsp;<font face="Courier New">public Tarefa Salvar(Tarefa tarefa)<br /> {<br />&nbsp;&nbsp;&nbsp;&nbsp; ///*Get Name attribute values (GUIDs) for list and view. */<br />&nbsp;&nbsp;&nbsp;&nbsp; System.Xml.XmlNode ndListView = Contexto.GetListAndView(&#8220;Tarefas&#8221;, &#8220;&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; string strListID = ndListView.ChildNodes[0].Attributes["Name"].Value;<br />&nbsp;&nbsp;&nbsp;&nbsp; string strViewID = ndListView.ChildNodes[1].Attributes["Name"].Value;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; /*Create an XmlDocument object and construct a Batch element and its<br />&nbsp;&nbsp;&nbsp;&nbsp; attributes. Note that an empty ViewName parameter causes the method to use the default view. */<br />&nbsp;&nbsp;&nbsp;&nbsp; System.Xml.XmlDocument doc = new System.Xml.XmlDocument();<br />&nbsp;&nbsp;&nbsp;&nbsp; System.Xml.XmlElement batchElement = doc.CreateElement(&#8220;Batch&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; batchElement.SetAttribute(&#8220;OnError&#8221;, &#8220;Continue&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; batchElement.SetAttribute(&#8220;ListVersion&#8221;, &#8220;1&#8243;);<br />&nbsp;&nbsp;&nbsp;&nbsp; batchElement.SetAttribute(&#8220;ViewName&#8221;, strViewID);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; batchElement.InnerXml = TarefaConverterHelper.TarefaParaXML(tarefa);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; Contexto.UpdateListItems(strListID, batchElement);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; return tarefa;<br /> }</font></p>
<p align="center"><em>Listagem 07: Método Salvar</em></p>
<p>&nbsp;</p>
<p><font face="Courier New"> public void Excluir(int id)<br /> {<br />&nbsp;&nbsp;&nbsp;&nbsp; /*Get Name attribute values (GUIDs) for list and view. */<br />&nbsp;&nbsp;&nbsp;&nbsp; System.Xml.XmlNode ndListView = Contexto.GetListAndView(&#8220;Tarefas&#8221;, &#8220;&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; string strListID = ndListView.ChildNodes[0].Attributes["Name"].Value;<br />&nbsp;&nbsp;&nbsp;&nbsp; string strViewID = ndListView.ChildNodes[1].Attributes["Name"].Value;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; /*Create an XmlDocument object and construct a Batch element and its<br />&nbsp;&nbsp;&nbsp;&nbsp; attributes. Note that an empty ViewName parameter causes the method to use the default view. */<br />&nbsp;&nbsp;&nbsp;&nbsp; System.Xml.XmlDocument doc = new System.Xml.XmlDocument();<br />&nbsp;&nbsp;&nbsp;&nbsp; System.Xml.XmlElement batchElement = doc.CreateElement(&#8220;Batch&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; batchElement.SetAttribute(&#8220;OnError&#8221;, &#8220;Continue&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp; batchElement.SetAttribute(&#8220;ListVersion&#8221;, &#8220;1&#8243;);<br />&nbsp;&nbsp;&nbsp;&nbsp; batchElement.SetAttribute(&#8220;ViewName&#8221;, strViewID);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; batchElement.InnerXml = &#8220;&lt;Method ID=&#8217;0&#8242; Cmd=&#8217;Delete&#8217;&gt;&lt;Field Name=&#8217;ID&#8217;&gt;&#8221; + id.ToString() + &#8220;&lt;/Field&gt;&lt;/Method&gt;&#8221;;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; Contexto.UpdateListItems(strListID, batchElement);<br /> }</font></p>
<p align="center"><font face="Courier New"><em>Listagem 08: Método Excluir</em></font></p>
<p align="justify"><em><font face="Courier New"></font></em>&nbsp;</p>
<p align="justify">Para testar a solução, sem precisar implementar a camada de apresentação ou o restante das regras de negócio implementei testes unitários, facilitando assim bastante o desenvolvimento.<font face="Courier New"></p>
<p></font></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fgehrke.wordpress.com/587/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fgehrke.wordpress.com/587/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fgehrke.wordpress.com/587/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fgehrke.wordpress.com/587/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fgehrke.wordpress.com/587/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fgehrke.wordpress.com/587/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fgehrke.wordpress.com/587/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fgehrke.wordpress.com/587/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fgehrke.wordpress.com/587/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fgehrke.wordpress.com/587/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fgehrke.wordpress.com/587/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fgehrke.wordpress.com/587/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fgehrke.wordpress.com/587/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fgehrke.wordpress.com/587/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=587&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiangehrke.com.br/2012/04/18/trabalhando-com-dados-do-sharepoint-online-com-o-web-service-lists-asmx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/43a149af1253deaba3d17779f3ff640a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fgehrke</media:title>
		</media:content>
	</item>
		<item>
		<title>Trabalhando com Dados do SharePoint Online com o .NET Client Object Model</title>
		<link>http://fabiangehrke.com.br/2012/04/18/trabalhando-com-dados-do-sharepoint-online-com-o-net-client-object-model/</link>
		<comments>http://fabiangehrke.com.br/2012/04/18/trabalhando-com-dados-do-sharepoint-online-com-o-net-client-object-model/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 17:09:49 +0000</pubDate>
		<dc:creator>Fabian André Gehrke</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Office 365]]></category>
		<category><![CDATA[SharePoint Online]]></category>

		<guid isPermaLink="false">https://fgehrke.wordpress.com/?p=585</guid>
		<description><![CDATA[O SharePoint 2010 trouxe várias formas de acessar seus dados remotamente, ou seja, a partir de programas que não estão executando no mesmo servidor. Esses recursos estão disponíveis na verão local (OnPremise) e no Office 365 (SharePoint Online). Neste post vou mostrar como trabalhar com esses dados do SharePoint Online, para isso vou utilizar uma [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=585&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">O SharePoint 2010 trouxe várias formas de acessar seus dados remotamente, ou seja, a partir de programas que não estão executando no mesmo servidor. Esses recursos estão disponíveis na verão local (OnPremise) e no Office 365 (SharePoint Online).</p>
<p align="justify">Neste post vou mostrar como trabalhar com esses dados do SharePoint Online, para isso vou utilizar uma lista de tarefas padrão do SharePoint e a API para acesso remoto através do .NET.</p>
<p><span id="more-585"></span>
<p align="justify">Para fazer a COM (Client Object Model) acessar o SharePoint Online temos um desafio bem grande: a autenticação. Se utilizar a mesma rotina que é utilizada no SharePoint local, não é possível conectar no SharePoint Onlin, dá erro de 403 Forbidden. Todo material que eu achei para resolver isso segue o mesmo padrão, criar uma classe, como por exemplo a implementação disponível na Code Gallery <a href="http://code.msdn.microsoft.com/Remote-Authentication-in-b7b6f43c/sourcecode?fileId=21439&amp;pathId=1168218626">ClaimClientContext</a>, que consiste na chamada da tela de login para o usuário informar as credenciais e depois pegar o cookie gerado para autenticar. Se o usuário salvar a senha não irá solicitar as credenciais novamente.</p>
<p align="justify">Com esse problema resolvido, o restante do código é igual para as soluções de SharePoint Online ou SharePoint OnPremise, o código completo deste projeto está no GitHub <a href="https://github.com/fgehrke/SharePoint-Demos">SharePoint-Demos</a> e contém diversos outros exemplo.</p>
<p align="justify">Neste post vou mostrar apenas a implementação da classe RepositorioTarefas, para ver as demais acesse os fontes do projeto.</p>
<p align="justify">A listagem 01 mostra a classe repositórios que abstrai a camada de SharePoint, para fazer isso criei uma classe chamada <em>Tarefa</em> e cada interação com o repositório ela é transformada de tarefa para item de lista ou item de lista para tarefa, conforme a necessidade. Esse código está na classe de helper chamada <em>TarefaConverterHelper</em>. </p>
<p align="justify">O método <em>ClaimClientContext.GetAuthenticatedContext</em> retorna um objeto do tipo <em>ClientContext</em>, se o objetivo for utilizar o SharePoint OnPremise este método deve ser substituído pela criação do ClientContext padrão.</p>
<p><font face="Courier New">using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Text;<br />using Microsoft.SharePoint.Client;<br />using ClientObjectModelDemo.Entidades;<br />using System.Net;<br />using ClientObjectModelDemo.Helpers;</font></p>
<p><font face="Courier New">namespace ClientObjectModelDemo<br />{<br />&nbsp;&nbsp;&nbsp; public class RepositorioTarefas<br />&nbsp;&nbsp;&nbsp; {</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private ClientContext Contexto;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Web Web;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private List ListaTarefas;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public RepositorioTarefas()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br /></font><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Contexto = ClaimClientContext.GetAuthenticatedContext(Constants.ENDRECO_SITE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Web = Contexto.Web;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ListaTarefas = this.Web.Lists.GetByTitle(&#8220;Tarefas&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p align="center"><em>Listagem 01: campos e construtor da classe RepositorioTarefas</em></p>
<p>&nbsp;</p>
<p align="justify">A listagem 02 mostra o método ObterTodos, que retorna todas as tarefas cadastradas na lista do SharePoint, após fazer isso converte os objetos itens de lista em objetos tarefas.</p>
<p><font face="Courier New">public List&lt;Tarefa&gt; ObterTodos()<br />{<br />&nbsp;&nbsp;&nbsp; CamlQuery camlQuery = new CamlQuery();<br />&nbsp;&nbsp;&nbsp; camlQuery.ViewXml = &#8220;&lt;View/&gt;&#8221;;<br />&nbsp;&nbsp;&nbsp; ListItemCollection itens = ListaTarefas.GetItems(camlQuery);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; Contexto.Load(itens);<br />&nbsp;&nbsp;&nbsp; Contexto.ExecuteQuery();</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; return TarefaConverterHelper.ItensParaTarefas(itens);<br />}</font></p>
<p align="center"><em>Listagem 02: Método ObterTodos</em></p>
<p>&nbsp;</p>
<p align="justify">A listagem 03 mostra a obtenção das tarefas passando como filtro um pedaço do título da tarefa. O filtro é feito utilizando CAML.</p>
<p><font face="Courier New">public List&lt;Tarefa&gt; ObterPorFiltro(string titulo)<br />{<br />&nbsp;&nbsp;&nbsp; CamlQuery camlQuery = new CamlQuery();<br />&nbsp;&nbsp;&nbsp; camlQuery.ViewXml = &#8220;&lt;View&gt;&lt;Query&gt;&lt;Where&gt; &#8221; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;&lt;Contains&gt; &#8221; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;&lt;FieldRef Name=&#8217;Title&#8217; /&gt; &#8221; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;&lt;Value Type=&#8217;Text&#8217;&gt;&#8221; + titulo + &#8220;&lt;/Value&gt; &#8221; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;&lt;/Contains&gt; &#8221; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;&lt;/Where&gt;&lt;/Query&gt;&lt;/View&gt; &#8220;;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; ListItemCollection itens = ListaTarefas.GetItems(camlQuery);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; Contexto.Load(itens);<br />&nbsp;&nbsp;&nbsp; Contexto.ExecuteQuery();</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; return TarefaConverterHelper.ItensParaTarefas(itens);<br />}</font></p>
<p align="center"><em>Método 03: Método ObterPorFiltro</em></p>
<p>&nbsp;</p>
<p align="justify">Para obter apenas um item pelo id foi criado o método ObterPorID, que recebe o id da tarefa e retorna o objeto tarefa.</p>
<p><font face="Courier New">public Tarefa ObterPorID(int id)<br />{<br />&nbsp;&nbsp;&nbsp; ListItem item = ListaTarefas.GetItemById(id);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; Contexto.Load(item);<br />&nbsp;&nbsp;&nbsp; Contexto.ExecuteQuery();</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; return TarefaConverterHelper.ItemParaTarefa(item);<br />}</font></p>
<p align="center"><em>Método 04: ObterPorID</em></p>
<p>&nbsp;</p>
<p align="justify">O método Salvar salva a tarefa recebida por parâmetro no SharePoint, se for uma tarefa sem id quer dizer que é uma tarefa nova, sendo assim cria um novo item, atribui os campos e insere o novo registro. Se já tiver id só atualiza os dados e salva.</p>
<p><font face="Courier New">public Tarefa Salvar(Tarefa tarefa)<br />{<br />&nbsp;&nbsp;&nbsp; ListItem itemTarefa;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; if (tarefa.ID == (default(int)))<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ListItemCreationInformation itemCreateInfo = new ListItemCreationInformation();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; itemTarefa = ListaTarefas.AddItem(itemCreateInfo);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; itemTarefa = ListaTarefas.GetItemById(tarefa.ID);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Contexto.Load(itemTarefa);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Contexto.ExecuteQuery();<br />&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; itemTarefa = TarefaConverterHelper.TarefaParaItem(tarefa, itemTarefa);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; itemTarefa.Update();<br />&nbsp;&nbsp;&nbsp; Contexto.ExecuteQuery();</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; return ObterPorID(itemTarefa.Id);<br />}</font></p>
<p align="center"><em>Método 05: Método Salvar</em></p>
<p>&nbsp;</p>
<p align="justify">O método excluir, conforme a listagem 06, recebe o id da tarefa e exclui no SharePoint.</p>
<p><font face="Courier New">public void Excluir(int id)<br />{<br />&nbsp;&nbsp;&nbsp; ListItem tarefa = ListaTarefas.GetItemById(id);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; tarefa.DeleteObject();</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; Contexto.ExecuteQuery();<br />}</font></p>
<p align="center"><em>Método 06: Método Excluir</em></p>
<p>&nbsp;</p>
<p align="justify">Para testar a solução, sem precisar implementar a camada de apresentação ou o restante das regras de negócio implementei testes unitários, facilitando assim bastante o desenvolvimento.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fgehrke.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fgehrke.wordpress.com/585/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fgehrke.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fgehrke.wordpress.com/585/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fgehrke.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fgehrke.wordpress.com/585/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fgehrke.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fgehrke.wordpress.com/585/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fgehrke.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fgehrke.wordpress.com/585/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fgehrke.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fgehrke.wordpress.com/585/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fgehrke.wordpress.com/585/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fgehrke.wordpress.com/585/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=585&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiangehrke.com.br/2012/04/18/trabalhando-com-dados-do-sharepoint-online-com-o-net-client-object-model/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/43a149af1253deaba3d17779f3ff640a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fgehrke</media:title>
		</media:content>
	</item>
		<item>
		<title>Semana de WebCasts de Office 365 Organizada pelos MTACs</title>
		<link>http://fabiangehrke.com.br/2012/04/17/semana-de-webcasts-de-office-365-organizada-pelos-mtacs/</link>
		<comments>http://fabiangehrke.com.br/2012/04/17/semana-de-webcasts-de-office-365-organizada-pelos-mtacs/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 00:01:38 +0000</pubDate>
		<dc:creator>Fabian André Gehrke</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Office 365]]></category>

		<guid isPermaLink="false">https://fgehrke.wordpress.com/?p=581</guid>
		<description><![CDATA[Assim como já vem acontecendo a algum tempo, na semana do dia 23/04/2012 teremos outra semana de web casts organizado pelos MTACs, agora será a vez do Office 365. O horário dos web casts será das 20:00 às 21:00. Segue a programação: Data Título Palestrante 23/04 Overview de Office 365 Mauricio Cassemiro (MTAC) 24/04 Exchange [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=581&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Assim como já vem acontecendo a algum tempo, na semana do dia 23/04/2012 teremos outra semana de web casts organizado pelos MTACs, agora será a vez do Office 365.</p>
<p><span id="more-581"></span>
<p><img style="float:none;margin-left:auto;display:block;margin-right:auto;" src="https://public.bay.livefilestore.com/y1psWSC2lCypIe1__HK639d3WliDbT7e2GZ4BiHQQTAiFAlpMHNP3wnAgF9dSExy_7QfNStfZ-P2U4zvHdUp7ACGg/305506_2986440231354_1572501311_32333745_1386333137_n.jpg?psid=1"></p>
<p>O horário dos web casts será das 20:00 às 21:00.</p>
<p>Segue a programação:</p>
<table cellspacing="0" cellpadding="2" width="546" border="0">
<tbody>
<tr>
<td valign="top" width="48">Data</td>
<td valign="top" width="232">Título</td>
<td valign="top" width="264">Palestrante</td>
</tr>
<tr>
<td valign="top" width="48">23/04</td>
<td valign="top" width="232"><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032511718&amp;Culture=pt-BR">Overview de Office 365</a></td>
<td valign="top" width="264"><a href="http://mcssc.wordpress.com/">Mauricio Cassemiro</a> (MTAC)</td>
</tr>
<tr>
<td valign="top" width="48">24/04</td>
<td valign="top" width="232"><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032511721&amp;Culture=pt-BR">Exchange Online</a></td>
<td valign="top" width="264"><a href="http://fernandoandreazi.com/">Fernando Andreazi</a> (MVP Office 365)</td>
</tr>
<tr>
<td valign="top" width="48">25/04</td>
<td valign="top" width="232"><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032511723&amp;Culture=pt-BR">SharePoint Online</a></td>
<td valign="top" width="264"><a href="http://fabiangehrke.com.br/">Fabian André Gehrke</a> (MVP SharePoint)</td>
</tr>
<tr>
<td valign="top" width="48">26/04</td>
<td valign="top" width="232"><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032511725&amp;Culture=pt-BR">Lync Online</a></td>
<td valign="top" width="264"><a href="http://sarabarbosa.net/">Sara Barbosa</a> (MVP Office 365)</td>
</tr>
<tr>
<td valign="top" width="48">27/04</td>
<td valign="top" width="232"><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032511727&amp;Culture=pt-BR">Office Professional Plus + Office Web Apps</a></td>
<td valign="top" width="264"><a href="http://mcssc.wordpress.com/">Mauricio Cassemiro</a> (MTAC)</td>
</tr>
</tbody>
</table>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fgehrke.wordpress.com/581/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fgehrke.wordpress.com/581/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fgehrke.wordpress.com/581/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fgehrke.wordpress.com/581/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fgehrke.wordpress.com/581/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fgehrke.wordpress.com/581/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fgehrke.wordpress.com/581/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fgehrke.wordpress.com/581/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fgehrke.wordpress.com/581/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fgehrke.wordpress.com/581/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fgehrke.wordpress.com/581/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fgehrke.wordpress.com/581/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fgehrke.wordpress.com/581/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fgehrke.wordpress.com/581/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=581&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiangehrke.com.br/2012/04/17/semana-de-webcasts-de-office-365-organizada-pelos-mtacs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/43a149af1253deaba3d17779f3ff640a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fgehrke</media:title>
		</media:content>

		<media:content url="https://public.bay.livefilestore.com/y1psWSC2lCypIe1__HK639d3WliDbT7e2GZ4BiHQQTAiFAlpMHNP3wnAgF9dSExy_7QfNStfZ-P2U4zvHdUp7ACGg/305506_2986440231354_1572501311_32333745_1386333137_n.jpg?psid=1" medium="image" />
	</item>
		<item>
		<title>Mesa Redonda Sobre A Regulamenta&#231;&#227;o da Profiss&#227;o de Inform&#225;tica&#8211;5&#170; Jornada da Computa&#231;&#227;o &#8211; UFU</title>
		<link>http://fabiangehrke.com.br/2012/04/15/mesa-redonda-sobre-a-regulamentao-da-profisso-de-informtica5-jornada-da-computao-ufu/</link>
		<comments>http://fabiangehrke.com.br/2012/04/15/mesa-redonda-sobre-a-regulamentao-da-profisso-de-informtica5-jornada-da-computao-ufu/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 00:23:01 +0000</pubDate>
		<dc:creator>Fabian André Gehrke</dc:creator>
				<category><![CDATA[Eventos]]></category>

		<guid isPermaLink="false">https://fgehrke.wordpress.com/?p=579</guid>
		<description><![CDATA[No dia 14/04/2012, continuando a 5ª Jornada da Computação da UFU em Uberlândia, aconteceu uma mesa redonda sobre a regulamentação da profissão de informática, onde profissionais da região foram convidados para participar da mesa. A discussão foi muito interessante, já que na mesa estavam pessoas que eram contra e outras a favor da regulamentação. Foram [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=579&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">No dia 14/04/2012, continuando a 5ª Jornada da Computação da UFU em Uberlândia, aconteceu uma mesa redonda sobre a regulamentação da profissão de informática, onde profissionais da região foram convidados para participar da mesa. </p>
<p><span id="more-579"></span>
<p align="justify">A discussão foi muito interessante, já que na mesa estavam pessoas que eram contra e outras a favor da regulamentação. Foram 2 horas de discussão com participação da mesa e do público presente.</p>
<p align="justify">O formato da discussão foi parecido com um debate político onde um tema era levantado e os participantes poderiam responder e a partir dessas respostas teríam réplicas e opiniões da público. Além disso o público também pode fazer perguntas aos membros da mesa.</p>
<p align="justify">Antes e depois da discussão o público era em grande parte a favor da regulamentação, alguns que estavam indecisos mudaram de opinião e também ficaram a favor da regulamentação.</p>
<p align="justify">Particularmente acho esse um tema muito delicado e que pode gerar muita discussão. Não sou contra a regulamentar e também não sou a favor. Confuso? Não, bem simples, o que me preocupa é a forma como será feito. Se for feito de uma forma onde o profissional de informática tenha vantagens e não apenas cobraças, acho interessante.</p>
<p align="justify">Obrigado ao Rogério Fontes e Karina Viana pelo convite, gostei muito de ter participado.</p>
<p><img src="https://public.bay.livefilestore.com/y1pq2amxM6uvqQ7cH2siPLT2DLKkhpstVpOq_dLlH5slt9ErPbJldhH7AnzE2uOUt73krGyQZ1yT5MDLiesJOEeFw/WP_000395.jpg?psid=1" width="600" height="450"></p>
<p align="center"><em>Imagem 01: Composição da Mesa</em></p>
<p>&nbsp;</p>
<p><img src="https://public.bay.livefilestore.com/y1pU1YVrLjwHOcdLfwAhTRle7jnN2iRoMzyBs1Mb-IQsECs_flby0RkWsgjfavZcqJNWN47dlbQ0lfpwwCQttuDfA/WP_000396.jpg?psid=1" width="600" height="450"></p>
<p align="center"><em>Imagem 02: Mesa e o moderador</em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fgehrke.wordpress.com/579/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fgehrke.wordpress.com/579/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fgehrke.wordpress.com/579/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fgehrke.wordpress.com/579/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fgehrke.wordpress.com/579/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fgehrke.wordpress.com/579/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fgehrke.wordpress.com/579/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fgehrke.wordpress.com/579/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fgehrke.wordpress.com/579/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fgehrke.wordpress.com/579/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fgehrke.wordpress.com/579/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fgehrke.wordpress.com/579/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fgehrke.wordpress.com/579/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fgehrke.wordpress.com/579/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=579&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiangehrke.com.br/2012/04/15/mesa-redonda-sobre-a-regulamentao-da-profisso-de-informtica5-jornada-da-computao-ufu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/43a149af1253deaba3d17779f3ff640a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fgehrke</media:title>
		</media:content>

		<media:content url="https://public.bay.livefilestore.com/y1pq2amxM6uvqQ7cH2siPLT2DLKkhpstVpOq_dLlH5slt9ErPbJldhH7AnzE2uOUt73krGyQZ1yT5MDLiesJOEeFw/WP_000395.jpg?psid=1" medium="image" />

		<media:content url="https://public.bay.livefilestore.com/y1pU1YVrLjwHOcdLfwAhTRle7jnN2iRoMzyBs1Mb-IQsECs_flby0RkWsgjfavZcqJNWN47dlbQ0lfpwwCQttuDfA/WP_000396.jpg?psid=1" medium="image" />
	</item>
		<item>
		<title>Teste Unit&#225;rios em Projetos SharePoint Utilizando o Padr&#227;o Reposit&#243;rio e a biblioteca Moq</title>
		<link>http://fabiangehrke.com.br/2012/04/13/teste-unitrios-em-projetos-sharepoint-utilizando-o-padro-repositrio-e-a-biblioteca-moq/</link>
		<comments>http://fabiangehrke.com.br/2012/04/13/teste-unitrios-em-projetos-sharepoint-utilizando-o-padro-repositrio-e-a-biblioteca-moq/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 19:46:00 +0000</pubDate>
		<dc:creator>Fabian André Gehrke</dc:creator>
				<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false">https://fgehrke.wordpress.com/?p=555</guid>
		<description><![CDATA[Testar projetos SharePoint algumas vezes pode ser um desafio, principalmente por causa dos dados estarem armazenados no SharePoint e para executar os testes eles devem ser executados diretamente de dentro do servidor. Para esse tipo de problema existem uma solução que consiste em substituir a camada de acesso a dados, no caso fazer um mock, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=555&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">Testar projetos SharePoint algumas vezes pode ser um desafio, principalmente por causa dos dados estarem armazenados no SharePoint e para executar os testes eles devem ser executados diretamente de dentro do servidor.</p>
<p align="justify">Para esse tipo de problema existem uma solução que consiste em substituir a camada de acesso a dados, no caso fazer um mock, e testar as regras de negócio sem precisar do SharePoint.</p>
<p align="justify">Neste post vou mostrar um exemplo de como fazer um mock utilizando a biblioteca <a href="http://code.google.com/p/moq/">Moq</a> com o padrão repostitório para executar os testes unitários nas regras de negócio.</p>
<p><span id="more-555"></span><span style="font-size:x-large;"><strong>Entidade</strong></span>
<p align="justify">Neste case vamos fazer algo bem simples, onde existirá uma entidade chamada pessoa, algumas propriedades e um método de negócio, que é bem simples e só concatena as propriedades, a listagem 01 mostra o código da classe Pessoa.</p>
<p><span style="font-family:'Courier New';">public class Pessoa<br />{<br />&nbsp;&nbsp;&nbsp; public int ID { get; set; }<br />&nbsp;&nbsp;&nbsp; public string Nome { get; set; }<br />&nbsp;&nbsp;&nbsp; public DateTime DataNascimento { get; set; }<br />&nbsp;&nbsp;&nbsp; public string Endereco { get; set; }<br />&nbsp;&nbsp;&nbsp; public int Idade<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (int) DateTime.Now.Subtract(DataNascimento).TotalDays / 365;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; public string ConcatenarDadosUsuario()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return string.Format(&#8220;ID: {0}, Nome: {1}, Idade: {2}, Endereço: {3}&#8221;, this.ID.ToString(), this.Nome, this.Idade.ToString(), this.Endereco);<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></span></p>
<p align="center"><em>Listagem 01: Implementação da classe pessoa</em></p>
<p><strong><span style="font-size:x-large;">Repositório</span></strong></p>
<p align="justify">Utilizando o padrão repositório todos os métodos de acesso a dados ficam na classe repositório, facilidando a sua substituição na hora do teste. O primeiro passo é construir a interface, conforme a listagem 02, depois implementar a classe que irá acessar o SharePoint para trabalhar com os dados. Por não haver necessidade, a classe que implementa a interface do repositório não foi implementada, apenas criadas com os métodos padrão. Em um ambiente real ela precisa ser implementada e é a partir dela que todo o acesso ao SharePoint é feito.</p>
<p><span style="font-family:'Courier New';">public interface IRepositorioPessoas<br />{</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; </span><span style="font-family:'Courier New';">Pessoa ObterPorID(int pessoaID);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; List&lt;Pessoa&gt; ObterTodos();</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; List&lt;Pessoa&gt; ObterPorFiltro(string nome);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; Pessoa Salvar(Pessoa pessoa);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; bool Excluir(int ID);<br />}</span></p>
<p align="center"><em>Listagem 02: A interface seguindo padrão repositório</em></p>
<p align="center"><em></em></p>
<p><span style="font-family:'Courier New';">public class RepositorioPessoa: IRepositorioPessoas<br />{<br />&nbsp;&nbsp;&nbsp; public Pessoa ObterPorID(int pessoaID)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NotImplementedException();<br />&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; public List&lt;Pessoa&gt; ObterTodos()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NotImplementedException();<br />&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; public List&lt;Pessoa&gt; ObterPorFiltro(string nome)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NotImplementedException();<br />&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; public Pessoa Salvar(Pessoa pessoa)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NotImplementedException();<br />&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; public bool Excluir(int ID)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NotImplementedException();<br />&nbsp;&nbsp;&nbsp; }<br />}</span></p>
<p align="center"><em>Listagem 03: Classe que trabalhar com os dados do SharePoint e implementa a inteface da listagem 02</em></p>
<p><strong><span style="font-size:x-large;">Teste</span></strong></p>
<p align="justify">A classe de teste é uma classe de teste unitário do Visual Studio, além da implementação feita na listagem 03 é necessário por a referência no projeto a biblioteca Moq (using Moq), que pode ser baixada diretamente pelo Visual Studio através do NuGet Packages (ou pelo site do <a href="http://code.google.com/p/moq/">Moq</a>).</p>
<p align="justify">A implementação da classe de teste é um pouco diferente de um testes normal, a primeira coisa a ser feita, na criação da classe de teste é criar o objeto moq para simular a nossa classe de negócio. Todos os dados e regras dos métodos serão implementados neste momento, veja o construtor PessoaTeste, onde um repositório de dados é montado e os métodos implementados. Vejam que é implementação do método mesmo, com as regras sobre os dados recém criados.</p>
<p align="justify">A partir do momento que todas as interações com os dados estão feitas, os testes podem ser criados e executados. Como as regras de negócio ficam em outra camada, é simples obter os dados fake e passar para eles e depois obter o resultado, possibilitando assim o teste das regras mesmo sem ter o repositório de dados oficial, no caso o SharePoint.</p>
<p><span style="font-family:'Courier New';">[TestClass]<br />public class PessoaTest<br />{<br />&nbsp;&nbsp;&nbsp; public readonly IRepositorioPessoas MockRepositorioPessoa;</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; public PessoaTest()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Pessoa&gt; pessoas = new List&lt;Pessoa&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Pessoa {ID = 1, Nome = &#8220;Pedro de Lara&#8221;, Endereco = &#8220;Rua Sem Nome, Nr 1&#8243;, DataNascimento = new DateTime(1990, 01, 01)},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Pessoa {ID = 2, Nome = &#8220;Carlos Lara da Silva&#8221;, Endereco = &#8220;Rua Sem Nome, Nr 2&#8243;, DataNascimento = new DateTime(1980, 12, 23)},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Pessoa {ID = 3, Nome = &#8220;João Cunha&#8221;, Endereco = &#8220;Rua Sem Nome, Nr 3&#8243;, DataNascimento = new DateTime(1989, 02, 02)</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; };</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; // Criação do Mock utilizando Moq<br />&nbsp;&nbsp;&nbsp; Mock&lt;IRepositorioPessoas&gt; mockProductRepository = new Mock&lt;IRepositorioPessoas&gt;();</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; // Nas linhas abaixo os métodos estão sendo configurados no mock</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; // Retorna todas as pessoas<br />&nbsp;&nbsp;&nbsp; mockProductRepository.Setup(mr =&gt; mr.ObterTodos()).Returns(pessoas);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; // Retorna a pessoa pelo ID<br />&nbsp;&nbsp;&nbsp; mockProductRepository.Setup(mr =&gt; mr.ObterPorID(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; It.IsAny&lt;int&gt;())).Returns((int i) =&gt; pessoas.Where(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p =&gt; p.ID == i).Single());</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; // Retorna as pessoas pelo filtro do nome<br />&nbsp;&nbsp;&nbsp; mockProductRepository.Setup(mr =&gt; mr.ObterPorFiltro(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; It.IsAny&lt;string&gt;())).Returns((string i) =&gt; pessoas.Where(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p =&gt; p.Nome.Contains(i)).ToList());</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; // Exclui a pessoa com ID passado por parâmetro<br />&nbsp;&nbsp;&nbsp; mockProductRepository.Setup(mr =&gt; mr.Excluir(It.IsAny&lt;int&gt;())).Returns(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (int id) =&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pessoa pessoa = pessoas.Where(p =&gt; p.ID == id).Single();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoas.Remove(pessoa);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; // Salva (insere ou altera) uma pessoa<br />&nbsp;&nbsp;&nbsp; mockProductRepository.Setup(mr =&gt; mr.Salvar(It.IsAny&lt;Pessoa&gt;())).Returns(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Pessoa pessoa) =&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DateTime now = DateTime.Now;</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pessoa.ID.Equals(default(int)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Insere a pessoa nova<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa.ID&nbsp; = pessoas.Count() + 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoas.Add(pessoa);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pessoa;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Atualiza a pessoa existente<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var original = pessoas.Where(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q =&gt; q.ID == pessoa.ID).Single();</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (original == null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; original.Nome = pessoa.Nome;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; original.Endereco = pessoa.Endereco;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; original.DataNascimento = pessoa.DataNascimento;</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return original;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Finaliza a configuração do mock<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.MockRepositorioPessoa = mockProductRepository.Object;<br />&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp; /// Verifica se todos as pessoas foram retornadas<br />&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp; [TestMethod]<br />&nbsp;&nbsp;&nbsp; public void PodeRetornarTodasPessoas()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Obtém todas as pessoas<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IList&lt;Pessoa&gt; pessoas = this.MockRepositorioPessoa.ObterTodos();</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsNotNull(pessoas); // Teste se é nulo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(3, pessoas.Count); // Verifica o número de pessoas retornadas<br />&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp; /// Verifica se todos se a pessoa foi retornada a partir do ID<br />&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp; [TestMethod]<br />&nbsp;&nbsp;&nbsp; public void PodeRetornarPessoaPorID()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Obtém a pessoa com ID 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pessoa pessoa = this.MockRepositorioPessoa.ObterPorID(1);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsNotNull(pessoa); // Teste se é nulo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(1, pessoa.ID); // Verifica a pessoa retornada é a correta<br />&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp; /// Verifica se todos as pessoas foram retornadas pelo filtro<br />&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp; [TestMethod]<br />&nbsp;&nbsp;&nbsp; public void PodeRetornarObterPorFiltro()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string nome = &#8220;Lara&#8221;;</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Obtém a pessoa com ID 1<br />List&lt;Pessoa&gt; pessoas = this.MockRepositorioPessoa.ObterPorFiltro(nome);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsNotNull(pessoas); // Teste se é nulo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(2, pessoas.Count); // Verifica a pessoa retornada é a correta<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(true, pessoas[0].Nome.Contains(nome)); // Verifica a pessoa retornada é a correta<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(true, pessoas[1].Nome.Contains(nome)); // Verifica a pessoa retornada é a correta<br />&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp; /// Verifica se a pessoa pode ser inserida<br />&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp; [TestMethod]<br />&nbsp;&nbsp;&nbsp; public void PodeInserir()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pessoa pessoa = new Pessoa();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa.Nome = &#8220;Pessoa da Silva&#8221;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa.Endereco = &#8220;Rua com Nome 123, nr 12, CEP 34032-000&#8243;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa.DataNascimento = new DateTime(1979, 12, 21);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int contador = this.MockRepositorioPessoa.ObterTodos().Count;</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Salva a pessoa<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa = this.MockRepositorioPessoa.Salvar(pessoa);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsNotNull(pessoa); // Teste se é nulo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(pessoa.ID, contador + 1);<br />&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp; /// Verifica se a pessoa pode ser alterada<br />&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp; [TestMethod]<br />&nbsp;&nbsp;&nbsp; public void PodeAlterar()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pessoa pessoa = new Pessoa();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int id = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa.ID = id;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string nome = &#8220;Pessoa da Silva&#8221;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa.Nome = nome;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa.Endereco = &#8220;Rua com Nome 123, nr 12, CEP 34032-000&#8243;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa.DataNascimento = new DateTime(1979, 12, 21);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int contador = this.MockRepositorioPessoa.ObterTodos().Count;</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Salva a pessoa<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pessoa = this.MockRepositorioPessoa.Salvar(pessoa);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.IsNotNull(pessoa); // Teste se é nulo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(pessoa.ID, id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(pessoa.Nome, nome);<br />&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp; /// Verifica se todos as pessoas foram retornadas<br />&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp; [TestMethod]<br />&nbsp;&nbsp;&nbsp; public void PodeExcluir()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int id = 3;</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Obtém a pessoa com ID 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool excluido = this.MockRepositorioPessoa.Excluir(id);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(true, excluido);<br />&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp; /// Verifica se todos as pessoas foram retornadas<br />&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp; [TestMethod]<br />&nbsp;&nbsp;&nbsp; public void PodeConcacentarDadosUsuario()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pessoa pessoa = this.MockRepositorioPessoa.ObterPorID(2);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string dadosUsuario = pessoa.ConcatenarDadosUsuario();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string dadosUsuarioCalculado = string.Format(&#8220;ID: {0}, Nome: {1}, Idade: {2}, Endereço: {3}&#8221;, pessoa.ID.ToString(), pessoa.Nome, pessoa.Idade.ToString(), pessoa.Endereco);</span></p>
<p><span style="font-family:'Courier New';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert.AreEqual(dadosUsuario, dadosUsuarioCalculado);<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></span></p>
<p align="center"><em>Listagem 03: Implementação do teste unitário</em></p>
<p>O código-fonte está disponível no GitHub: <strong><a href="https://github.com/fgehrke/Testes-Unitarios-SharePoint">Testes-Unitarios-SharePoint</a></strong></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fgehrke.wordpress.com/555/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fgehrke.wordpress.com/555/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fgehrke.wordpress.com/555/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fgehrke.wordpress.com/555/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fgehrke.wordpress.com/555/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fgehrke.wordpress.com/555/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fgehrke.wordpress.com/555/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fgehrke.wordpress.com/555/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fgehrke.wordpress.com/555/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fgehrke.wordpress.com/555/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fgehrke.wordpress.com/555/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fgehrke.wordpress.com/555/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fgehrke.wordpress.com/555/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fgehrke.wordpress.com/555/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=555&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiangehrke.com.br/2012/04/13/teste-unitrios-em-projetos-sharepoint-utilizando-o-padro-repositrio-e-a-biblioteca-moq/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/43a149af1253deaba3d17779f3ff640a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fgehrke</media:title>
		</media:content>
	</item>
		<item>
		<title>Desvendando o SharePoint na Uniube (2)&#8211;Como foi</title>
		<link>http://fabiangehrke.com.br/2012/04/13/desvendando-o-sharepoint-na-uniube/</link>
		<comments>http://fabiangehrke.com.br/2012/04/13/desvendando-o-sharepoint-na-uniube/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 14:38:08 +0000</pubDate>
		<dc:creator>Fabian André Gehrke</dc:creator>
				<category><![CDATA[Eventos]]></category>

		<guid isPermaLink="false">https://fgehrke.wordpress.com/?p=567</guid>
		<description><![CDATA[No dia 12/04/2012 tive o prazer de voltar a palestrar na Uniube de Uberlândia, desta vez no outro campus e para alunos do 5º ao 10º período dos cursos de Engenharia da Computação, Elétrica, Civil, Ambiental, Produção, Administração e Direito, compareceram cerca de 40 alunos que fizeram várias perguntas sobre o assunto. Como vários cursos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=567&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p align="justify">No dia 12/04/2012 tive o prazer de voltar a palestrar na Uniube de Uberlândia, desta vez no outro campus e para alunos do 5º ao 10º período dos cursos de Engenharia da Computação, Elétrica, Civil, Ambiental, Produção, Administração e Direito, compareceram cerca de 40 alunos que fizeram várias perguntas sobre o assunto.</p>
<p align="justify">Como vários cursos participaram da palestra o foco foi direcionado em como eles poderiam tirar proveito do SharePoint como usuários e usuários avançados, além de poderem propor ou contratar soluções de maneira mais eficiente.</p>
<p align="justify">Gostaria de agradecer ao <a href="http://gesmarjunior.wordpress.com/">Gesmar Júnior</a> e a professora Lilian Paiva pela oportunidade.</p>
<p><span id="more-567"></span></p>
<p><img src="https://public.bay.livefilestore.com/y1pwgErNbQlApztdPoUBMBOIzg9esc-X5_sakxSsQKAvEWSqf11Hb0mNa8jpemsARY_I6hN8KL4_snvEAJm2YLSSQ/WP_000344.jpg?psid=1" alt="" width="600" height="800" /></p>
<p align="center"><em>Imagem 01: Cartaz de divulgação da palestra</em></p>
<p align="center"><em></em></p>
<p><img src="https://public.bay.livefilestore.com/y1p6KipthEYRnNO0LUB9jDEUS34hpue3EX6ZaxjDhNJG7MyYpVBgkgBZh1fJSjtHmsLSOWVxu9EdKtArYRrwnIXyQ/WP_000346.jpg?psid=1" alt="" width="600" height="800" /></p>
<p align="center"><em>Imagem 02: Iniciando a palestra</em></p>
<p align="center"><em></em></p>
<div align="center">
<div id="__ss_12527145" style="width:425px;"><strong><a title="Desvendando o SharePoint 2010 para Estudantes" href="http://www.slideshare.net/fgehrke/desvendando-o-sharepoint-2010-para-estudantes" target="_blank">Desvendando o SharePoint 2010 para Estudantes</a></strong><iframe src='http://www.slideshare.net/slideshow/embed_code/12527145' width='425' height='348' scrolling='no'></iframe></p>
<div style="padding:5px 0 12px;">View more <a href="http://www.slideshare.net/thecroaker/death-by-powerpoint" target="_blank">PowerPoint</a> from <a href="http://www.slideshare.net/fgehrke" target="_blank">Fabian Gehrke</a></div>
</div>
</div>
<p><a href="https://skydrive.live.com/redir.aspx?cid=4ec733696e21204d&amp;resid=4EC733696E21204D!13396&amp;parid=root">Mais fotos</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fgehrke.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fgehrke.wordpress.com/567/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fgehrke.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fgehrke.wordpress.com/567/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fgehrke.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fgehrke.wordpress.com/567/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fgehrke.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fgehrke.wordpress.com/567/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fgehrke.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fgehrke.wordpress.com/567/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fgehrke.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fgehrke.wordpress.com/567/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fgehrke.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fgehrke.wordpress.com/567/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fabiangehrke.com.br&#038;blog=16172465&#038;post=567&#038;subd=fgehrke&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://fabiangehrke.com.br/2012/04/13/desvendando-o-sharepoint-na-uniube/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/43a149af1253deaba3d17779f3ff640a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fgehrke</media:title>
		</media:content>

		<media:content url="https://public.bay.livefilestore.com/y1pwgErNbQlApztdPoUBMBOIzg9esc-X5_sakxSsQKAvEWSqf11Hb0mNa8jpemsARY_I6hN8KL4_snvEAJm2YLSSQ/WP_000344.jpg?psid=1" medium="image" />

		<media:content url="https://public.bay.livefilestore.com/y1p6KipthEYRnNO0LUB9jDEUS34hpue3EX6ZaxjDhNJG7MyYpVBgkgBZh1fJSjtHmsLSOWVxu9EdKtArYRrwnIXyQ/WP_000346.jpg?psid=1" medium="image" />
	</item>
	</channel>
</rss>
