Share via


SharePoint Online

Collaborazione basata su cloud con SharePoint Online

Chris Mayo

Scarica il codice di esempio

Con il rilascio di Office 365 Microsoft presenterà la nuova versione dei Microsoft Online Services, un servizio di collaborazione e comunicazione basato sul cloud e su SharePoint 2010, Exchange 2010 e Lync Server 2010. Office 365, attualmente nella versione beta, fornirà SharePoint, Exchange e Lync come offerta di software ospitato su servizio basato su sottoscrizioni, ospitato in data center cloud gestiti da Microsoft.

SharePoint Online, la versione di SharePoint 2010 basata su cloud, fornirà agli utenti molte funzionalità di SharePoint 2010, ma senza l'esigenza di gestire l'hardware e il software necessari per una soluzione di collaborazione scalabile e protetta. In questo articolo verrà analizzata una panoramica delle analogie e delle differenze di sviluppo tra SharePoint Online e SharePoint 2010 con la compilazione di soluzioni eseguibili in SharePoint Online.

Con la nuova versione di SharePoint Online, gli sviluppatori di SharePoint saranno in grado di sviluppare soluzioni di collaborazione con le stesse competenze e gli stessi strumenti disponibili nello sviluppo in SharePoint 2010, tra cui Visual Studio 2010, SharePoint Designer 2010, C# o Visual Basic, nonché API e SDK di SharePoint. Sussistono molte analogie tra lo sviluppo per SharePoint on-premise e nel cloud, ma anche moltissime differenze che incidono sul metodo di compilazione delle soluzioni.

Conoscere queste differenze consentirà di capire quali soluzioni creare per l'esecuzione in SharePoint Online e come sviluppare tali soluzioni.

Analogie nelle personalizzazioni di SharePoint Online

Nello sviluppo di SharePoint 2010 è possibile personalizzare SharePoint mediante il browser e SharePoint Designer 2010, nonché compilando soluzioni con Visual Studio 2010. Con SharePoint Online la personalizzazione con il browser e SharePoint Designer 2010 è più o meno analoga a quella di SharePoint 2010 (con le differenze nelle funzionalità citate nella sezione successiva). Anche lo sviluppo di soluzioni SharePoint Online mediante Visual Studio 2010 non presenta sostanziali modifiche. In Visual Studio 2010 viene eseguito rispetto a un'istanza locale di SharePoint 2010 (in locale in Windows 7 o Windows Server 2008 R2 oppure in una macchina virtuale), attingendo all'esperienza di debug integrata per uno sviluppo iterativo. Al termine dello sviluppo, la soluzione verrà caricata in SharePoint Online mediante la stessa raccolta di soluzioni disponibile in SharePoint 2010.

Differenze principali nelle personalizzazioni di SharePoint Online

Sebbene SharePoint Online sia basato su SharePoint 2010, è opportuno considerare alcune differenze principali in fase di sviluppo di soluzioni che verranno eseguite online. Per iniziare, SharePoint Online supporta esclusivamente soluzioni con ambito Web e di sito. Viene eseguito in un cloud multitenant, in cui più tenancy vengono eseguite in un'infrastruttura di data center comune, e pertanto è logico che le soluzioni con ambito di farm (in cui una funzionalità viene attivata per l'intera farm) non siano supportate. In modo analogo, in SharePoint Online il livello di accesso più elevato alla tenancy SharePoint è al livello della raccolta di siti e pertanto non sono supportate neppure le funzionalità con ambito WebApplication (in cui una funzionalità viene eseguita in ogni sito Web in un'applicazione Web).

Secondo punto: in SharePoint Online sono supportate solo soluzioni con attendibilità parziale. Non sono supportate soluzioni con attendibilità totale, ovvero le soluzioni che possono accedere oltre il livello della raccolta di siti oppure con autorizzazione di esecuzione con privilegi di livello di amministratore nel farm.

Infine, sebbene SharePoint Online sia basato su SharePoint 2010, non presenta lo stesso numero di funzionalità del suo corrispettivo on-premise. Per un confronto completo delle singole funzionalità in SharePoint 2010 e SharePoint Online, fare riferimento alla descrizione dei servizi beta di Microsoft SharePoint Online, disponibile nella pagina relativa alle descrizioni dei servizi beta di Office 365 all'indirizzo bit.ly/bBckol.

L'elenco delle singole funzionalità a confronto indica che è supportata la maggior parte delle funzionalità di personalizzazione di SharePoint. L'assenza di supporto per i Servizi di integrazione applicativa (BCS), gli elenchi esterni e la capacità di chiamare servizi Web all'esterno di SharePoint Online (non supportato nelle soluzioni con attendibilità parziale) incide in modo significativo sulla compilazione delle soluzioni eseguite in SharePoint Online. In futuro è tuttavia previsto il supporto per i Servizi di integrazione applicativa.

Tenendo presente queste analogie e differenze, passiamo ora ad alcuni esempi dei tipi di soluzioni che è possibile compilare per l'esecuzione in SharePoint Online, tra cui le soluzioni in modalità sandbox e il modello a oggetti del client di SharePoint. Altri tipi di soluzioni, ad esempio l'automazione di processi aziendali mediante soluzioni di flussi di lavoro dichiarativi, verranno trattati in articoli futuri.

Sviluppo per SharePoint Online con soluzioni in modalità sandbox

Come si evince dalla sezione precedente, le soluzioni SharePoint Online devono avere come ambito funzionalità Web o di siti, sono limitate ai dati nella raccolta di siti e devono essere eseguite con attendibilità parziale. Lo sviluppo di soluzioni eseguite in modalità sandbox soddisfa tutti questi criteri, consentendo al contempo agli amministratori di SharePoint Online di distribuire agevolmente una soluzione caricandola direttamente nella raccolta di soluzioni.

Visual Studio 2010 offre il supporto per le soluzioni in modalità sandbox, incluso il supporto per i modelli di progetti e dei relativi elementi, la Personalizzazione guidata SharePoint per creare nuovi progetti come soluzioni in modalità sandbox, il supporto IntelliSense per le API di SharePoint con ambito di raccolta di siti e infine il supporto per il debug e il packaging. Per iniziare a compilare una soluzione per SharePoint Online, sviluppare ed eseguire il debug della soluzione in locale con SharePoint 2010 (è necessario installare Windows 7 a 64 bit o Windows Server 2008 R2 con SharePoint 2010 e Visual Studio 2010). Un altro metodo consigliato consiste nell'utilizzare 2010 Information Worker Demonstration and Evaluation Virtual Machine (RTM), che offre un ambiente di sviluppo SharePoint 2010 virtualizzato (download disponibile all'indirizzo bit.ly/ezfe2Y). È inoltre consigliabile utilizzare Visual Studio 2010 SharePoint Power Tools (bit.ly/azq882), una serie di strumenti che consentono di aggiungere supporto in fase di compilazione per la sandbox e un modello di elemento di progetto di Web part visiva in modalità sandbox.

Negli esempi di questo articolo verrà compilata una soluzione semplicemente garantendo ai dipendenti della società fittizia Contoso Corp. la possibilità di richiedere acquisti non supportati nel sistema di approvvigionamento. Per iniziare, creare una raccolta di siti e un sito nell'ambiente di sviluppo SharePoint 2010 on-premise. Utilizzare le macchine virtuali citate e creare il sito http://o365dpe.contoso.com/sites/spomsdnmag/purchasing. Con la prima soluzione verrà distribuito l'elenco utilizzato per tenere traccia di questi acquisiti non standard. Aprire Visual Studio 2010, selezionare File | Nuovo progetto e quindi, nella relativa finestra di dialogo, selezionare Progetto SharePoint vuoto e denominare il progetto PurchasingMgr.

Nella finestra di dialogo Personalizzazione guidata SharePoint immettere nel campo "Selezionare il sito locale..." l'URL del sito, http://o365dpe.contoso.com/sites/spomsdnmag/Purchasing/, quindi selezionare "Distribuisci come soluzione creata mediante sandbox" e fare clic su Fine come indicato nella Figura 1.

image: Specify the Site and Trust Level for PurchasingMgr

Figura 1 Specificare il sito e il livello di attendibilità per PurchasingMgr

Selezionare quindi il progetto PurchasingMgr in Esplora soluzioni, fare clic con il pulsante destro del mouse e scegliere Aggiungi | Nuovo elemento. Nella finestra di dialogo Aggiungi nuovo elemento selezionare SharePoint 2010 nel nodo dei modelli installati per i modelli degli elementi SharePoint supportati. Non sono supportati tutti i modelli nelle soluzioni in modalità sandbox e quindi in SharePoint Online. Nella Figura 2 sono illustrati i modelli di elementi supportati nelle soluzioni in modalità sandbox.

Figura 2 Modelli di elementi supportati nelle soluzioni in modalità sandbox

Modello di elemento Compatibilità sandbox Note
Web part visiva No È necessario installare il file ASCX in SharePoint Server
Web part visiva (sandbox) Fornita con Visual Studio 2010 SharePoint Power Tools
Web part  
Flusso di lavoro sequenziale No È necessario distribuire la soluzione del flusso di lavoro come soluzione farm
Flusso di lavoro macchina a stati No È necessario distribuire la soluzione del flusso di lavoro come soluzione farm
Modello del servizio di integrazione applicativa dei dati No È necessario distribuire la soluzione BCS come soluzione di attendibilità completa; funzionalità non supportata in SharePoint Online
Pagina applicazione No È necessario distribuire la pagina ASPX in SharePoint Server
Ricevitore di eventi  
Modulo  
Tipo di contenuto  
Definizione di elenco da tipo di contenuto  
Definizione di elenco  
Istanza di elenco  
Elemento vuoto  
Controllo utente No È necessario installare il file ASCX in SharePoint Server

Per compilare l'elenco, definire le colonne del sito e il tipo di contenuto per l'elenco selezionando il modello di elemento Tipo di contenuto e immettere NonStandBusPurchaseRequestsCT nel campo del nome.

Nella Personalizzazione guidata SharePoint selezionare Elemento come tipo di contenuto di base e fare clic su Fine. Il tipo di contenuto disporrà di una colonna per il titolo, una per la descrizione e una per il prezzo, che verranno definite in modo dichiarativo sostituendo i contenuti del file Elements.xml creato con il codice XML della Figura 3.

Figura 3 Definizione di NonStandBusPurchaseRequestsCT mediante 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>

Definire ora un elenco basato sul tipo di contenuto facendo clic con il pulsante destro del mouse su PurchasingMgr in Esplora soluzioni e scegliendo Aggiungi nuovo elemento. Selezionare Definizione di elenco dal modello di elemento Tipo di contenuto e denominare la definizione di elenco NonStandBusPurchaseRequestsListDefn, quindi fare clic su Aggiungi.

Nella Personalizzazione guidata SharePoint scegliere il tipo di contenuto creato in precedenza e selezionare la casella "Aggiungi un'istanza di elenco". Nella Figura 4 è illustrato il file Elements.xml creato per NonStandBusPurchaseRequestsListDefn.

Figura 4 Definizione di NonStandBusPurchaseRequestsListDefn mediante 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>

Ogni definizione di elenco nella funzionalità deve essere identificata da un valore Tipo univoco maggiore di 10.000 (per evitare conflitti con gli elenchi definiti da SharePoint). Il valore verrà utilizzato per definire qualsiasi istanza di elenco basata sulla definizione.

Per aggiungere le colonne personalizzate alla visualizzazione elenco, aprire il file Schema.xml creato e aggiungere gli elementi FieldRef alla visualizzazione predefinita, come illustrato nella Figura 5.

Figura 5 Aggiunta di colonne personalizzate alla visualizzazione predefinita di 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>

Definire infine un'istanza dell'elenco selezionando ListInstance1 in NonStandBusPurchaseRequestsListDefn e rinominarlo NonStandBusPurchaseRequestsListInstance. Aprire il file Elements.xml e aggiungere il codice XML seguente per fare in modo che l'elenco sia basato sul tipo di contenuto e per fornire descrizioni utili per gli utenti:

<?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>

In Visual Studio 2010 selezionare Debug e quindi Avvia debug per testare la soluzione. La soluzione viene inserita in un pacchetto e distribuita nel sito on-premise, come illustrato nella Figura 6.

image: Debugging the PurchasingMgr Solution

Figura 6 Debug della soluzione PurchasingMgr

Dopo aver testato la soluzione PurchasingMgr, passare alla fase di distribuzione in SharePoint Online. Creare una nuova raccolta di siti in SharePoint Online denominata Acquisti utilizzando il modello Sito del team. In Visual Studio 2010 inserire la soluzione in un pacchetto facendo clic con il pulsante destro del mouse sul progetto PurchasingMgr in Esplora soluzioni e scegliere Pacchetto. Per distribuire la soluzione in SharePoint Online, è sufficiente caricarla nella raccolta di soluzioni e attivare le funzionalità del sito (è necessario disporre di privilegi di amministratore per la raccolta di siti). A tale scopo accedere a SharePoint Online e passare alla raccolta di siti, quindi selezionare Azioni sito | Impostazioni sito, quindi Soluzioni per accedere alla raccolta di soluzioni. Nella raccolta di soluzioni fare clic sulla scheda Soluzioni e selezionare Carica soluzione nella barra multifunzione, quindi passare al file PurchasingMgr.wsp in bin\Debug e fare clic su OK e su Attiva. La soluzione verrà visualizzata nella raccolta di soluzioni, come illustrato nella Figura 7.

image: PurchasingMgr Solution Deployed to SharePoint Online

Figura 7 Soluzione PurchasingMgr distribuita in SharePoint Online

Per attivare quindi la funzionalità contenente le colonne del sito, il tipo di contenuto e l'elenco, passare al sito Acquisti e selezionare Azioni sito | Impostazioni sito | Gestisci caratteristiche sito. Selezionare la funzionalità Direttore acquisti - Tipi di contenuto ed elenchi, quindi fare clic su Attiva. A questo punto verranno visualizzati gli elenchi delle richieste di acquisti business non standard nel sito SharePoint Online.

Direttore acquisti è solo un esempio dei risultati che è possibile conseguire in SharePoint Online con le soluzioni in modalità sandbox. Tenere presente le limitazioni relative alle soluzioni in modalità sandbox e alle funzionalità supportate in SharePoint Online, per creare soluzioni che verranno eseguite in SharePoint 2010 o SharePoint Online.

Creazione di soluzioni lato client con Silverlight

Il modello a oggetti client, introdotto in SharePoint 2010, fornisce un'API lato client orientata agli oggetti per i client SharePoint compilata mediante Microsoft .NET Framework, Silverlight ed ECMAScript (inclusi JavaScript e JScript) in esecuzione in computer remoti (incluso il browser per Silverlight ed ECMAScript). L'API è coerente non lo spazio dei nomi lato server Microsoft.SharePoint ed è pertanto semplice da apprendere. L'API è coerente anche con i tipi di client supportati ed è pertanto semplice applicare questo livello di conoscenza in varie soluzioni client. L'API del modello a oggetti client è supportata in SharePoint Online e rappresenta uno strumento utile per lo sviluppo cloud.

È ad esempio possibile utilizzare il modello a oggetti client per creare un'applicazione Silverlight 4 al fine di aggiungere elementi all'elenco e ospitare l'applicazione in una Web part in modalità sandbox. A tale scopo, aprire Visual Studio 2010, selezionare File | Nuovo progetto e quindi, nella relativa finestra di dialogo, selezionare Progetto SharePoint vuoto. Denominare il progetto PurchasingMgrWP e fare clic su OK. Creare nuovamente la soluzione come soluzione in modalità sandbox e puntarla al sito Acquisti on-premise. Per creare l'applicazione Silverlight 4, fare clic con il pulsante destro del mouse sulla soluzione PurchasingMgrWP, scegliere Silverlight nei modelli installati, quindi selezionare Applicazione Silverlight e denominare la soluzione NonStandBusPurchaseReqsSLOM. Nella finestra di dialogo Nuova applicazione Silverlight deselezionare "Ospita l'applicazione Silverlight in un nuovo sito Web" (il test verrà eseguito ospitando l'applicazione in SharePoint) e selezionare Silverlight 4 per la versione Silverlight.

Per fare riferimento all'API del modello a oggetti client Silverlight, aggiungere riferimenti a Microsoft.SharePoint.Client.Silverlight.dll e Microsoft.SharePoint.Client.Silverlight.Runtime.dll in C:\Programmi\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ClientBin. Creare quindi l'interfaccia utente Silverlight aprendo il file MainPage.xaml e sostituendo XAML con il codice nella 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>

Il codice XAML nella Figura 8 definisce le caselle di testo e un pulsante per raccogliere le informazioni da aggiungere all'elenco, come illustrato nella Figura 9.

image: MainPage.xaml in Designer

Figura 9 MainPage.xaml nella finestra di progettazione

Fare doppio clic nella finestra di progettazione e sostituire la classe con il codice nella 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);
      });
    }
  }
}

Il codice nella Figura 10 segue uno schema comune nel codice del modello a oggetti client. Accedere innanzitutto al contesto client tramite la classe ClientContext (equivalente alla classe SPContext). Accedere quindi al sito e all'elenco rispettivamente tramite le classi Web, ListCollection e List. Notare la somiglianza con le classi SPWeb, SPListCollection e SPList. Creare infine un elemento ListItem chiamando il metodo List.AddItem, popolarlo con i dati dell'interfaccia utente e chiamare il metodo ListItem.Update. L'elemento ListItem non verrà creato finché non verranno chiamati i metodi ClientContext.Load e ClientContext.ExecuteQueryAsync per eseguire la query. È possibile salvare roundtrip nel server caricando più query tramite ClientContext.Load, chiamando il metodo ClientContext.ExecuteQueryAsync.

Per distribuire l'applicazione Silverlight 4, aggiungere un modulo per distribuire l'applicazione con il progetto Web part. Selezionare PurchasingMgrWP in Esplora soluzioni, fare clic con il pulsante destro del mouse e scegliere Aggiungi | Nuovo elemento, quindi denominare il modulo ClientBin. Sostituire i contenuti del file Elements.xml creato con questo codice 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>

Il codice XML distribuisce il file NonStandBusPurchaseReqsSLOM.xap nella cartella ClientBin all'interno del sito SharePoint.

Per distribuire l'output del progetto NonStandBusPurchaseReqsSLOM con il modulo ClientBin, selezionare il modulo ClientBin in Esplora soluzioni e aprire la finestra di dialogo delle proprietà Riferimenti all'output del progetto. Fare clic su Aggiungi e selezionare NonStandBusPurchaseReqsSLOM come nome di progetto ed ElementFile come tipo di distribuzione.

Aggiungere quindi una Web part personalizzata alla soluzione SharePoint per ospitare l'applicazione Silverlight 4. Selezionare PurchasingMgrWP in Esplora soluzioni, fare clic con il pulsante destro del mouse e scegliere Aggiungi | Nuovo elemento, selezionare Web part e quindi denominare la Web part NonStandBusPurchaseReqsWP. Utilizzare una Web personalizzata per passare parametri all'applicazione Silverlight 4, ad esempio l'URL del sito utilizzato per creare ClientContext. A tale scopo aggiungere una classe helper denominata SilverlightObjectTagControl.cs e sostituire il corpo della classe con il codice nella Figura 11.

Figura 11 Aggiunta della classe helper 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>"
          ));

      }
    }
  }
}

La classe SilverlightObjectTagControl nella Figura 11 presenta due proprietà: Source consente di passare l'URL dell'applicazione Silverlight da caricare nella Web part e InitParameters di passare i parametri di inizializzazione all'applicazione Silverlight 4. Queste proprietà vengono utilizzare per creare il tag <object /> per l'applicazione Silverlight nel metodo CreateChildControls. Per utilizzare la classe, aprire NonStandBusPurchaseReqsWP.cs e sostituire il codice della classe con quello della 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);
    }
  }
}

Il codice illustrato nella Figura 12 crea un'istanza di SilverlightObjectTagControl, imposta la proprietà Source sull'URL dell'applicazione Silverlight in ClientBin e la proprietà InitParameters per contenere l'URL del sito corrente (in cui è disponibile l'elenco delle richieste di acquisti business non standard). Per passare l'URL al costruttore della classe MainPage in NonStandBusPurchaseReqsSLOM, aprire App.xaml.cs e aggiungere il codice seguente all'evento Application_Startup:

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

    this.RootVisual = new MainPage(url);
  }

Per testare la Web part, distribuire il pacchetto PurchasingMgr.wsp nel sito Acquisti on-premise per distribuire l'elenco delle richieste di acquisti business non standard (rimosso al termine della sessione di debug indicata in precedenza), quindi eseguire il debug della soluzione PurchasingMgrWP da Visual Studio 2010. Una volta aggiunta a \Purchasing\Home.aspx, la Web part consentirà di aggiungere elementi direttamente all'elenco di Silverlight, come illustrato nella Figura 13 e Figura 14.

image: The NonStandBusPurchaseReqsWP in Action

Figura 13 NonStandBusPurchaseReqsWP in azione

image: The Updated Non-Standard Business Purchase Requests List

Figura 14 Elenco aggiornato delle richieste di acquisti business non standard

Lo sviluppo e il debug nel sito on-premise consente di utilizzare Visual Studio 2010 per eseguire il debug del codice SharePoint e Silverlight 4 finché la soluzione non sarà stata testata. A questo punto caricare PurchasingMgrWP.wsp nella raccolta di soluzioni in SharePoint Online.

Il modello a oggetti clienti SharePoint fornisce un'API orientata agli oggetti familiare e coerente per accedere agli elenchi e alle raccolte in SharePoint Online. L'API è un subset dell'API Microsoft.SharePoint con ambito fino alla raccolta di siti, perfettamente in linea con lo sviluppo di SharePoint Online.

Soluzioni SharePoint nel cloud

Ricapitolando, SharePoint Online fornisce agli sviluppatori SharePoint un'opportunità irripetibile di compilare soluzioni SharePoint per il cloud attingendo alle competenze e agli strumenti già acquisiti. Grazie alla conoscenza delle funzionalità di personalizzazione di SharePoint Online (inclusi gli elementi supportati o meno), delle soluzioni in modalità sandbox, del modello a oggetti client di SharePoint e dei flussi di lavoro dichiarativi creati mediante SharePoint Designer 2010, è possibile compilare soluzioni SharePoint eseguibili nel cloud con SharePoint Online. Per eseguire lo sviluppo di SharePoint Online mediante il processo beta, consultare il Centro Risorse per sviluppatori di SharePoint Online (msdn.com/sharepointonline).

Chris Mayo è un esperto di tecnologie Office 365 e SharePoint Online. Scrittore e relatore di contenuti tecnici per un pubblico di varie dimensioni, è coautore del libro "Programming for Unified Communications with Microsoft Office Communications Server 2007 R2" (Microsoft Press, 2009). Lavora in Microsoft da 10 anni. In passato ha collaborato come sviluppatore e progettista nei reparti IT di società Fortune 500 nel settore finanziario e di vendite al dettaglio. Il blog di Mayo è disponibile all'indirizzo blogs.msdn.com/b/cmayo.

Un ringraziamento ai seguenti esperti tecnici per la revisione dell'articolo: George Durzi, Steve Fox, AJ May e Christina Storm