SharePoint Online

Colaboração baseada na nuvem com o SharePoint Online

Chris Mayo

Baixar o código de exemplo

Com o lançamento do Office 365, a Microsoft apresentará a próxima versão do Microsoft Online Services, um serviço de colaboração e comunicação em nuvem baseado no SharePoint 2010, no Exchange 2010 e no Lync Server 2010. O Office 365, atualmente em versão beta, terá o SharePoint, o Exchange e o Lync como oferta SaaS (software como um serviço) baseada em assinatura, hospedada em datacenters em nuvem gerenciados pela Microsoft.

O SharePoint Online — a versão baseada em nuvem do SharePoint 2010 — oferecerá aos usuários muitos dos mesmos recursos do SharePoint 2010, mas sem a necessidade de gerenciar o hardware ou o software exigido por uma solução de colaboração segura e escalonável. Neste artigo, apresentarei uma visão geral de como o desenvolvimento com o SharePoint Online é semelhante e, ao mesmo tempo, diferente do desenvolvimento com o SharePoint 2010 criando soluções executadas no SharePoint Online.

Com o próximo lançamento do SharePoint Online, os desenvolvedores do SharePoint poderão desenvolver soluções de colaboração usando as mesmas habilidades e ferramentas que utilizam para desenvolver no SharePoint 2010, incluindo Visual Studio 2010, SharePoint Designer 2010, C# ou Visual Basic e APIs e SDKs do SharePoint. Existem muitas semelhanças entre o desenvolvimento para SharePoint localmente e na nuvem, mas também há diferenças importantes que afetarão o modo como você cria soluções.

Entender essas diferenças ajudará a compreender quais soluções podem ser criadas para execução no SharePoint Online e como desenvolver essas soluções.

Semelhanças de personalização do SharePoint Online

No desenvolvimento com o SharePoint 2010, é possível personalizar o SharePoint usando o navegador e o SharePoint Designer 2010 e criando soluções com o Visual Studio 2010. No SharePoint Online, a personalização com o navegador e o SharePoint Designer 2010 é basicamente igual à do SharePoint 2010 (considerando as diferenças de recursos mencionadas na próxima seção). Desenvolver soluções do SharePoint Online usando o Visual Studio 2010 também é basicamente o mesmo processo. O desenvolvimento é feito no Visual Studio 2010 em uma instância local do SharePoint 2010 (em execução local no Windows 7 ou Windows Server 2008 R2 ou em uma máquina virtual [VM]), aproveitando a experiência de depuração integrada para desenvolvimento iterativo. Quando o desenvolvimento é concluído, a solução é carregada no SharePoint Online usando a mesma Galeria de Soluções disponível no SharePoint 2010.

Principais diferenças de personalização do SharePoint Online

Embora o SharePoint Online seja baseado no SharePoint 2010, existem algumas diferenças importantes que devem ser consideradas quando você desenvolve soluções que serão executadas no primeiro. A primeira delas é que o SharePoint Online dá suporte apenas para soluções com escopo de site e Web. Ele é executado em uma nuvem multilocatária, em que vários aluguéis são executados em uma infraestrutura de datacenter compartilhada, portanto faz sentido não haver suporte para soluções com escopo de farm (em que um recurso é ativado para o farm inteiro). Da mesma forma, no SharePoint Online, o mais alto nível de acesso ao aluguel do SharePoint é o nível de conjunto de sites, por isso também não há suporte para recursos com escopo WebApplication (em que um recurso é executado em cada site em um aplicativo Web).

A segunda diferença é que apenas soluções de confiança parcial são suportadas no SharePoint Online. Também não há suporte para soluções de confiança total, em que a solução teria acesso além do nível de conjunto de sites ou poderia receber permissões para executar com privilégios de administrador no farm.

Por último, apesar de o SharePoint Online ser baseado no SharePoint 2010, ele não tem 100% de paridade de recursos com seu equivalente local. Para ver uma comparação completa, recurso a recurso, entre o SharePoint 2010 e o SharePoint Online, consulte a Descrição do Serviço Microsoft SharePoint Online Beta, disponível nas páginas de Descrições do Serviço Office 365 Beta, em bit.ly/bBckol.

A lista recurso a recurso mostra que há suporte para a maioria de recursos de personalização do SharePoint. A falta de suporte para Serviços Corporativos de Conectividade (BCS), Listas Externas e a capacidade de chamar serviços Web fora do SharePoint Online (o que não tem suporte em soluções de confiança parcial) terá um impacto considerável na criação de soluções executadas no SharePoint Online. No entanto, há planos de suporte para BCS em uma versão futura.

Tendo em mente essas semelhanças e diferenças, vejamos alguns exemplos dos tipos de soluções que você pode criar para serem executadas no SharePoint Online, inclusive soluções em área restrita e o modelo de objeto (OM) do cliente SharePoint. Outros tipos de solução, como a automatização de processos empresariais via soluções de fluxo de trabalho declarativo, serão abordados em futuros artigos.

Desenvolvendo para SharePoint Online com soluções em área restrita

Na seção anterior, você aprendeu que soluções do SharePoint Online devem ter escopo para recursos de site ou Web, estão restritas a dados no conjunto de sites e devem ser executadas em confiança parcial. Desenvolver soluções que executem como soluções em área restrita atende a todos esses critérios e, ao mesmo tempo, permite que administradores do SharePoint Online implantem uma solução facilmente carregando-a diretamente na Galeria de Soluções.

O Visual Studio 2010 tem excelente suporte para soluções em área restrita, incluindo suporte para modelos de projeto e modelos de item de projeto, o Assistente para Personalização do SharePoint (para criar novos projetos como soluções em área restrita), suporte IntelliSense para as APIs do SharePoint com escopo de conjunto de sites e suporte para depuração e empacotamento. Para começar a criar uma solução para o SharePoint Online, você irá desenvolver e depurar a solução localmente no SharePoint 2010. Você precisará do Windows 7 de 64 bits ou do Windows Server 2008 R2 instalado junto com o SharePoint 2010 e o Visual Studio 2010. Outro bom modo de começar é usar o 2010 Information Worker Demonstration and Evaluation Virtual Machine (RTM), que oferece um ambiente de desenvolvimento no SharePoint 2010 virtualizado (disponível para download em bit.ly/ezfe2Y). Também recomendo o Visual Studio 2010 SharePoint Power Tools (bit.ly/azq882), que adiciona suporte em tempo de compilação para a área restrita e um modelo de item de projeto Visual Web Part em área restrita.

Nos exemplos citados neste artigo, criarei uma solução usando o cenário simples de propiciar aos funcionários da fictícia Contoso Corp. a capacidade de solicitar compras que não têm suporte no sistema de aquisição. Para começar, criarei um conjunto de sites e um site no meu ambiente local de desenvolvimento em SharePoint 2010. Estou usando as VMs mencionadas anteriormente, por isso criei http://o365dpe.contoso.com/sites/spomsdnmag/purchasing. Minha primeira solução implantará a lista usada para rastrear essas compras não padrão. Depois de abrir o Visual Studio 2010, seleciono Arquivo | Novo Projeto e, na caixa de diálogo Novo Projeto, seleciono Projeto Vazio do SharePoint e nomeio o projeto como PurchasingMgr.

Na caixa de diálogo do Assistente para Personalização do SharePoint, em “Que site local …”, insiro a URL do meu site, http://o365dpe.contoso.com/sites/spomsdnmag/Purchasing/, seleciono “Implantar como solução em área restrita” e clico em Concluir, como mostra a Figura 1.

Figura 1 Especifique o site e o nível de confiança para PurchasingMgr

Em seguida, seleciono o projeto PurchasingMgr no Solution Explorer, clico com o botão direito do mouse e seleciono Add | New Item. Na caixa de diálogo Add New Item, seleciono SharePoint 2010 no nó de modelos instalados para os modelos de item suportados do SharePoint. Nem todos esses modelos têm suporte em soluções em área restrita e, portanto, no SharePoint Online. A Figura 2 mostra os modelos de item suportados em soluções em área restrita.

Figura 2 Modelos de item suportados em soluções em área restrita

Modelo de item Compatível com área restrita? Observações
Visual Web Part Não Exige a instalação do arquivo ASCX em servidores SharePoint
Visual Web Part (em área restrita) Sim Disponível mediante instalação do Visual Studio 2010 SharePoint Power Tools
Web Part Sim  
Fluxo de trabalho sequencial Não Requer que a solução de fluxo de trabalho seja implantada como Solução de Farm
Fluxo de trabalho da máquina de estado Não Requer que a solução de fluxo de trabalho seja implantada como Solução de Farm
Modelo de Conectividade de Dados Corporativos Não Requer que a solução BCS seja implantada como solução de confiança total; recurso sem suporte no SharePoint Online
Página de Aplicativo Não Exige a implantação da página ASPX no servidor SharePoint
Receptor de Evento Sim  
Módulo Sim  
Tipo de Conteúdo Sim  
Definição de Lista de Tipo de Conteúdo Sim  
Definição de Lista Sim  
Instância de Lista Sim  
Elemento Vazio Sim  
Controle de Usuário Não Exige a instalação do arquivo ASCX em servidores SharePoint

Para criar minha lista, definirei Colunas de Site e um Tipo de Conteúdo para a lista selecionando o modelo de item Tipo de Conteúdo e especificando NonStandBusPurchaseRequestsCT como o nome.

No Assistente para Personalização do SharePoint, seleciono Item como o tipo de conteúdo de base e clico em Concluir. O Tipo de Conteúdo terá três colunas - Título, Descrição e Preço - que definirei de modo declarativo substituindo o conteúdo do arquivo Elements.xml criado pelo XML na Figura 3.

Figura 3 Definição NonStandBusPurchaseRequestsCT via Elements.xml

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">

  <Field SourceID="https://schemas.microsoft.com/sharepoint/v3"
    ID="{A74E67E5-8905-4280-90C9-DEBFFC30D43D}"
    Name="RequestDescription"
    DisplayName="Description"
    Group="Purchasing Manager Custom Columns"
    Type="Note"
    DisplaceOnUpgrade="TRUE" />
  <Field SourceID="https://schemas.microsoft.com/sharepoint/v3"
    ID="{CB5054F5-0C60-4DBE-94D2-CEFBFB793C7F}"
    Name="Price"
    DisplayName="Price"
    Group="Purchasing Manager Custom Columns"
    Type="Currency"
    DisplaceOnUpgrade="TRUE" />

  <!-- Parent ContentType: Item (0x01) -->
  <ContentType ID="0x010078a81c8413f54917856495e56e7c09ed"
    Name="Purchasing Manager - Non-Standard Business Purchase Requests Content Type"
    Group="Purchasing Manager Content Types"
    Description=
      "Non-Standard Business Purchase Requests Content Type 
       for the Purchasing Manager Solution"
    Inherits="TRUE"
    Version="0">
    <FieldRefs>
      <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title"    
        DisplayName="Title" />
      <FieldRef ID="{A74E67E5-8905-4280-90C9-DEBFFC30D43D}" 
        Name="RequestDescription"  
        Required="TRUE" />
      <FieldRef ID="{CB5054F5-0C60-4DBE-94D2-CEFBFB793C7F}" Name="Price" 
        Required="TRUE" />
    </FieldRefs>
  </ContentType>
</Elements>

Em seguida, defino uma lista com base nesse tipo de conteúdo clicando com o botão direito do mouse em PurchasingMgr, no Solution Explorer, e selecionando Add New Item. Seleciono o modelo de item Definição de Lista de Tipo de Conteúdo, nomeio a definição de lista como NonStandBusPurchaseRequestsListDefn e clico em Add.

No Assistente para Personalização do SharePoint, seleciono o tipo de conteúdo criado anteriormente e seleciono a caixa “Add a list instance”. O Elements.xml criado para NonStandBusPurchaseRequestsListDefn é mostrado na Figura 4.

Figura 4 Definição NonStandBusPurchaseRequestsListDefn via Elements.xml

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
  <!-- Do not change the value of the Name attribute below. 
    If it does not match the folder name of the List Definition project item,
    an error will occur when the project is run. -->
    <ListTemplate
      Name="NonStandBusPurchaseRequestsListDefn"
      Type="10051"
      BaseType="0"
      OnQuickLaunch="TRUE"
      SecurityBits="11"
      Sequence="410"
      DisplayName="Purchasing Manager – 
        Non-Standard Business Purchase Requests List Definition"
      Description=
        "Non-Standard Business Purchase Requests List Definition 
         for the Purchasing Manager Solution"
      Image="/_layouts/images/itgen.png"/>
</Elements>

Cada definição de lista do meu recurso precisa ser identificada por um valor Type exclusivo maior que 10.000 (para evitar conflitos com listas definidas pelo SharePoint), e uso esse valor para definir qualquer instância de lista baseada nessa definição.

Para adicionar as colunas personalizadas ao modo de exibição de lista, abro o arquivo Schema.xml criado e adiciono os elementos FieldRef ao modo de exibição padrão, como visto na Figura 5.

Figura 5 Adicionando colunas personalizadas ao modo de exibição padrão NonStandBusPurchaseRequestsListDefn

<View BaseViewID="1" Type="HTML" WebPartZoneID="Main"  
  DisplayName="$Resources:core,objectiv_schema_mwsidcamlidC24;" 
  DefaultView="TRUE" MobileView="TRUE" MobileDefaultView="TRUE" 
  SetupPath="pages\viewpage.aspx" ImageUrl="/_layouts/images/generic.png" 
  Url="AllItems.aspx">
  <Toolbar Type="Standard" />
  <XslLink Default="TRUE">main.xsl</XslLink>
  <RowLimit Paged="TRUE">30</RowLimit>
  <ViewFields>
    <FieldRef Name="Attachments">
    </FieldRef>
    <FieldRef Name="LinkTitle">
    </FieldRef>
    <FieldRef ID="{A74E67E5-8905-4280-90C9-DEBFFC30D43D}" 
      Name="RequestDescription" />
    <FieldRef ID="{CB5054F5-0C60-4DBE-94D2-CEFBFB793C7F}" Name="Price" />
  </ViewFields>
  <Query>
    <OrderBy>
      <FieldRef Name="ID">
      </FieldRef>
    </OrderBy>
  </Query>
  <ParameterBindings>
    <ParameterBinding Name="NoAnnouncements"   
      Location="Resource(wss,noXinviewofY_LIST)" />
    <ParameterBinding Name="NoAnnouncementsHowTo"   
      Location="Resource(wss,noXinviewofY_DEFAULT)" />
  </ParameterBindings>
</View>

Por último, defino uma instância da lista selecionando ListInstance1 em NonStandBusPurchaseRequestsListDefn e a renomeio como NonStandBusPurchaseRequestsListInstance. Abro Elements.xml e adiciono o seguinte XML para basear a lista no tipo de conteúdo e fornecer descrições úteis para os usuários:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
  <ListInstance Title="Non-Standard Business Purchase Requests"
    OnQuickLaunch="TRUE"
    TemplateType="10051"
    Url="Lists/NonStandBusPurchaseRequestsListInstance"
    Description=
      "Non-Standard Business Purchase Requests List 
       for the Purchasing Manager Solution">
  </ListInstance>
</Elements>

No Visual Studio 2010, seleciono Depurar e Iniciar Depuração para testar a solução. A solução é empacotada e implantada no meu site local, como podemos ver na Figura 6.

Figura 6 Depurando a solução PurchasingMgr

Agora que testei a solução PurchasingMgr, estou pronto para implantá-la no SharePoint Online. Criarei um novo conjunto de sites no SharePoint Online chamado Purchasing usando o modelo Site de Equipe. De volta ao Visual Studio 2010, empacoto a solução clicando com o botão direito do mouse no projeto PurchasingMgr, no Solution Explorer, e selecionando a opção para empacotar. Para implantar a solução no SharePoint Online, basta carregá-la na Galeria de Soluções e ativar os recursos do site (para isso, preciso de privilégios de administrador do conjunto de sites). Para fazer isso, faço logon no SharePoint Online, navego até a minha coleção de sites e seleciono Ações do Site | Configurações do Site e, depois, Solutions para acessar a Galeria de Soluções. Na Galeria de Soluções, clico na guia Soluções e seleciono a opção para carregar a solução na faixa de opções; em seguida, localizo o arquivo PurchasingMgr.wsp em bin\Debug, clico em OK e em Ativar. Você verá a solução na Galeria de Soluções, como ilustrado na Figura 7.

Figura 7 A solução PurchasingMgr implantada no SharePoint Online

Em seguida, para ativar o recurso que contém as colunas do site, tipo de conteúdo e lista, navego até o site Purchasing e seleciono Ações do Site | Configurações do Site | Gerenciar Recursos do Site. Seleciono o recurso Purchasing Manager – Tipos de Conteúdo e Listas e escolho Ativar. Nesse momento, você deverá ver as listas de solicitações de compras não padrão no site do SharePoint Online.

O Purchasing Manager é apenas um exemplo do que você pode fazer no SharePoint Online com soluções em área restrita. Lembre-se das limitações de soluções em área restrita e dos recursos suportados pelo SharePoint Online, e você pode criar soluções que serão executadas no SharePoint 2010 ou no SharePoint Online.

Criando soluções de cliente com o Silverlight

O OM de cliente, também introduzido com o SharePoint 2010, oferece uma API de cliente orientada a objeto para os clientes SharePoint compilados usando o Microsoft .NET Framework, Silverlight e ECMAScript (incluindo JavaScript e JScript) executados em computadores remotos (com o navegador para Silverlight e ECMAScript). A API é consistente com o namespace de servidor Microsoft.SharePoint, por isso é fácil de aprender. Ela também é consistente entre os tipos de cliente suportados e, por isso, é fácil aplicar esse conhecimento entre diferentes soluções de cliente. A API OM de cliente é suportada no SharePoint Online e é uma ferramenta valiosa para desenvolvimento em nuvem.

Por exemplo, posso usar o OM de cliente para criar um aplicativo Silverlight 4 para adicionar itens à minha lista e hospedar o aplicativo em uma Web Part em área restrita. Para isso, abro o Visual Studio 2010, seleciono Arquivo | Novo Projeto e, na caixa de diálogo Novo Projeto, seleciono Projeto Vazio do SharePoint. Nomeio o projeto como PurchasingMgrWP e clico em OK. Novamente, vou criar a solução como uma solução em área restrita e apontá-la no meu site de compras local. Para criar o aplicativo Silverlight 4, clico com o botão direito do mouse na solução PurchasingMgrWP, seleciono Silverlight em Modelos Instalados, seleciono Aplicativo Silverlight e nomeio a solução como NonStandBusPurchaseReqsSLOM. Na caixa de diálogo Novo Aplicativo Silverlight, desmarco a opção para hospedar o aplicativo Silverlight em um novo site (faremos o teste hospedando o aplicativo no SharePoint) e seleciono o Silverlight 4 em Versão do Silverlight.

Para fazer referência à API OM de cliente do Silverlight, adicionarei referências a Microsoft.SharePoint.Client.Silverlight.dll e a Microsoft.SharePoint.Client.Silverlight.Runtime.dll no diretório C:\Arquivos de Programas\Arquivos Comuns\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ClientBin. Em seguida, vou criar a interface de usuário do Silverlight abrindo MainPage.xaml e substituindo o XAML pelo código mostrado na Figura 8.

Figura 8 NonStandBusPurchaseReqsSLOM MainPage.xaml

<UserControl xmlns:sdk="https://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
  x:Class="NonStandBusPurchaseReqsSLOM.MainPage"
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="d"
  d:DesignHeight="300" d:DesignWidth="400">

  <Grid x:Name="LayoutRoot" Background="White">
    <Grid.ColumnDefinitions>
      <ColumnDefinition />
      <ColumnDefinition />
    </Grid.ColumnDefinitions>
      <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
      </Grid.RowDefinitions>
        
      <sdk:Label Content="Title:" Grid.Column="0" Grid.Row="0" Margin="3"/>
      <sdk:Label Content="Description:" Grid.Column="0" Grid.Row="1" Margin="3"/>
      <sdk:Label Content="Price:" Grid.Column="0" Grid.Row="2" Margin="3"/>
        
      <TextBox Name="Title" Grid.Column="1" Grid.Row="0" Margin="3"/>
      <TextBox Name="Description" Grid.Column="1" Grid.Row="1" Margin="3"/>
      <TextBox Name="Price" Grid.Column="1" Grid.Row="2" Margin="3"/>
        
      <Button Content="Add" Grid.Column="1" Grid.Row="3" Margin="3"     
        Name="addNonStanPurchaseReq" HorizontalAlignment="Right" 
        Height="25" Width="100" Click="addNonStanPurchaseReq_Click" />
  </Grid>
</UserControl>

O XAML exibido na Figura 8 define caixas de texto e um botão para coletar informações e adicioná-las à minha lista, como podemos ver na Figura 9.

Figura 9 MainPage.xaml no designer

Clique duas vezes no botão no designer e substitua a classe pelo código na Figura 10.

Figura 10 addNonStanPurchaseReq_Click

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using Microsoft.SharePoint.Client;

namespace NonStandBusPurchaseReqsSLOM
{
  public partial class MainPage : UserControl
  {
    private string webUrl;

    public MainPage(string url)
    {
      webUrl = url;

      InitializeComponent();
    }

    private void addNonStanPurchaseReq_Click(object sender, RoutedEventArgs e)
    {   
      ClientContext clientContext = new ClientContext(webUrl);

      Web webSite = clientContext.Web;
      ListCollection webLists = webSite.Lists;

      List nonStandBusPurList = 
        clientContext.Web.Lists.GetByTitle(
        "Non-Standard Business Purchase Requests");

      ListItem newListItem = 
        nonStandBusPurList.AddItem(new ListItemCreationInformation());
        newListItem["Title"] = Title.Text;
        newListItem["RequestDescription"] = Description.Text;
        newListItem["Price"] = Price.Text;
                        
        newListItem.Update();

        clientContext.Load(nonStandBusPurList, list => list.Title);

        clientContext.ExecuteQueryAsync(onQuerySucceeded, onQueryFailed);
    }

    private void onQuerySucceeded(
      object sender, ClientRequestSucceededEventArgs args)
    {
      Dispatcher.BeginInvoke(() =>
      {
        MessageBox.Show("New item added.");
      });
    }


    private void onQueryFailed(object sender, 
      ClientRequestFailedEventArgs args)
    {
      Dispatcher.BeginInvoke(() =>
      {
        MessageBox.Show("Request failed. " + args.Message + "\n" + 
          args.StackTrace);
      });
    }
  }
}

O código na Figura 10 segue um padrão comum no código do OM de cliente. Primeiro, obtenho acesso ao contexto de cliente por meio da classe ClientContext (que é equivalente à classe SPContext). Em seguida, acesso o site e a lista usando as classes Web, ListCollection e List, respectivamente. Observe a semelhança com as classes SPWeb, SPListCollection e SPList. Para terminar, crio um ListItem chamando o método List.AddItem, preencho com dados da interface de usuário e chamo o método ListItem.Update. Na verdade, ListItem só é criado depois que os métodos ClientContext.Load e ClientContext.ExecuteQueryAsync são chamados para executar a consulta. É possível economizar viagens de ida e volta ao servidor carregando várias consultas via ClientContext.Load, chamando o método ClientContext.ExecuteQueryAsync.

Para implantar o aplicativo Silverlight 4, adicionarei um módulo para fazer a implantação com o meu projeto de Web Part. Seleciono PurchasingMgrWP no Solution Explorer, clico com o botão direito do mouse para selecionar Add | New Item |Module e nomeio o módulo como ClientBin. Substituo o conteúdo de Elements.xml criado por este XML:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
  <Module Name="ClientBin">
    <File Path="ClientBin\NonStandBusPurchaseReqsSLOM.xap"  
      Url="ClientBin/NonStandBusPurchaseReqsSLOM.xap" />
  </Module>
</Elements>

Esse XML implanta o arquivo NonStandBusPurchaseReqsSLOM.xap na pasta ClientBin do meu site SharePoint.

Para implantar a saída do projeto NonStandBusPurchaseReqsSLOM com o módulo ClientBin, seleciono o módulo ClientBin no Solution Explorer e abro a caixa de diálogo de propriedades Project Output References. Clico em Add e seleciono NonStandBusPurchaseReqsSLOM como nome do projeto e ElementFile como o tipo de implantação.

Em seguida, adiciono uma Web Part personalizada à solução do SharePoint para hospedar meu aplicativo Silverlight 4. Seleciono PurchasingMgrWP no Solution Explorer, clico com o botão direito do mouse para selecionar Add | New Item, seleciono Web Part e nomeio a Web Part como NonStandBusPurchaseReqsWP. Usarei uma Web Part personalizada para passar parâmetros ao meu aplicativo Silverlight 4, como a URL do site utilizado para criar ClientContext. Para isso, adiciono uma classe auxiliar chamada SilverlightObjectTagControl.cs e substituo seu corpo pelo código mostrado na Figura 11.

Figura 11 Adicionando a classe auxiliar SilverlightObjectTagControl.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace PurchasingMgrWP
{
  class SilverlightObjectTagControl : WebControl
  {
    public string Source { get; set; }
    public string InitParameters { get; set; }

    protected override void CreateChildControls()
    {
      base.CreateChildControls();

      if (Source != null && Source != "")
      {
        string width = (this.Width == Unit.Empty) ? "400" : 
          this.Width.ToString();
        string height = (this.Height == Unit.Empty) ? "300" : 
          this.Height.ToString();

        this.Controls.Add(new LiteralControl(
          "  <div>" +
          "  <object data=\"data:application/x-silverlight-2,\" +
          "  type=\"application/x-silverlight-2\" width=\"" + width +         
          "  "\" height=\"" + height + "\">" +
          "  <param name=\"source\" value=\"" + Source + "\"/>" +
          "  <param name=\"onerror\" value=\"onSilverlightError\" />" +
          "  <param name=\"background\" value=\"white\" />" +
          "  <param name=\"minRuntimeVersion\" value=\"4.0.50826.0\" />" +
          "  <param name=\"autoUpgrade\" value=\"true\" />" +
          "  <param name=\"initparams\" value=\"" + InitParameters + "\" />" +
          "  <a href=\"https://go.microsoft.com/fwlink/?LinkID=" +
          "  149156&v=4.0.50826.0\" +
          "  style=\"text-decoration: none;\">" +
          "  <img src=\"https://go.microsoft.com/fwlink/?LinkId=161376\" +
          "  alt=\"Get Microsoft Silverlight\" style=\"border-style: none\"/>" +
          "  </a>" +
          "  </object>" +
          "  <iframe id=\"_sl_historyFrame\" +
          "  style=.visibility:hidden;height:0;width:0;border:0px.></iframe>" +
          "  </div>"
          ));

      }
    }
  }
}

A classe SilverlightObjectTagControl na Figura 11 tem duas propriedades: Source é usada para passar a URL do aplicativo Silverlight a ser carregado na Web Part, e InitParameters para passar parâmetros de inicialização ao aplicativo Silverlight 4. Essas propriedades são utilizadas para construir a marca <object /> para o aplicativo Silverlight no método CreateChildControls. Para usar essa classe, abra NonStandBusPurchaseReqsWP.cs e substitua o código na classe pelo código mostrado na Figura 12.

Figura 12 NonStandBusPurchaseReqsWP.cs

using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;

namespace PurchasingMgrWP.NonStandBusPurchaseReqsWP
{
  [ToolboxItemAttribute(false)]
  public class NonStandBusPurchaseReqsWP : WebPart
  {
    protected override void CreateChildControls()
    {
      base.CreateChildControls();

      SilverlightObjectTagControl slhc = 
        new SilverlightObjectTagControl();
      slhc.Source = SPContext.Current.Site.Url + 
        "/ClientBin/NonStandBusPurchaseReqsSLOM.xap";
      slhc.InitParameters = "url=" + SPContext.Current.Web.Url;

        this.Controls.Add(slhc);
    }
  }
}

O código na Figura 12 cria uma instância de SilverlightObjectTagControl, define a propriedade Source para a URL do aplicativo Silverlight em ClientBin e define a propriedade InitParameters para conter a URL do site atual (no qual está disponível a lista de solicitações de compras não padrão). Para passar a URL ao construtor da classe MainPage em NonStandBusPurchaseReqsSLOM, abra App.xaml.cs e adicione o seguinte código ao evento Application_Startup:

private void Application_Startup(object sender, 
    StartupEventArgs e)
  {
    string url = e.InitParams["url"];

    this.RootVisual = new MainPage(url);
  }

Para testar a Web Part, implante o pacote PurchasingMgr.wsp no site de compras local para implantar a lista de solicitações de compras não padrão (que foi removida quando a sessão de depuração mencionada anteriormente foi encerrada) e, em seguida, depure a solução PurchasingMgrWP com o Visual Studio 2010. Quando adicionada a \Purchasing\Home.aspx, a Web Part permite que eu adicione itens diretamente à lista no Silverlight, como visto na Figura 13 e na Figura 14.

Figura 13 NonStandBusPurchaseReqsWP em ação

Figura 14 A lista atualizada de solicitações de compras não padrão

Desenvolver e depurar no site local permite que eu use o Visual Studio 2010 para depurar código do SharePoint e do Silverlight 4 até que a solução seja testada por completo. Nesse ponto, carrego PurchasingMgrWP.wsp na Galeria de Soluções do SharePoint Online.

O OM de cliente do SharePoint oferece uma API orientada a objeto conhecida e consistente para acessar listas e bibliotecas no SharePoint Online. A API é um subconjunto da API Microsoft.SharePoint e tem escopo no conjunto de sites, perfeitamente alinhada para desenvolvimento no SharePoint Online.

Soluções do SharePoint na nuvem

Em suma, o SharePoint Online oferece a desenvolvedores do SharePoint uma oportunidade única para criar soluções do SharePoint para a nuvem usando as habilidades e ferramentas de que eles já dispõem. Entendendo os recursos de personalização do SharePoint Online (inclusive o que tem e não tem suporte), soluções em área restrita, o OM de cliente do SharePoint e fluxos de trabalho declarativos criados usando o SharePoint Designer 2010, é possível desenvolver soluções do SharePoint executadas na nuvem com o SharePoint Online. Para se manter atualizado quanto ao desenvolvimento no SharePoint Online durante todo o processo beta, visite a Central de Recursos para Desenvolvedores do SharePoint Online (msdn.com/sharepointonline).

Chris Mayo é especialista em tecnologia especializado no Office 365 e no SharePoint Online. Ele tem experiência como escritor e orador e ministra conteúdo técnico a públicos que variam desde pequenos grupos a milhares de pessoas. É coautor do livro “Programming for Unified Communications with Microsoft Office Communications Server 2007 R2” (Microsoft Press, 2009). Trabalha na Microsoft há 10 anos. Antes de ingressar na Microsoft, trabalhou como desenvolvedor e arquiteto nos departamentos de TI de empresas da Fortune 500 atuantes nos setores financeiro e de varejo. Acompanhe o trabalho de Mayo em seu blog, blogs.msdn.com/b/cmayo.

Agradecemos aos seguintes especialistas técnicos pela revisão deste artigo: George Durzi, Steve Fox, AJ May e Christina Storm