Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Windows Azure: interagire con il Cloud Storage da Visual Basic 2010 - quarta parte

Concludiamo con questo post la mini-serie dedicata all'interazione con il Cloud Storage di Windows Azure anche lato client, da codice Visual Basic 2010.

Nell'ultimo post avevamo definito e concluso la creazione di una libreria di servizio che sfrutta le API managed di Azure SDK; tale libreria semplifica le modalità di creazione/eliminazione container, upload/download/rimozione blob.

In questo post ci proponiamo di illustrare un esempio di client WPF che sfrutti la libreria. L'esempio sarà piuttosto semplice/semplificato. Per un esempio molto più completo, e complesso, potete scaricare il mio progetto Azure Blob Studio 2011 da CodePlex.

Creiamo quindi un progetto WPF in VB 2010 ed aggiungiamo un riferimento alla libreria precedentemente creata (in Azure Blob Studio si chiama DelSole.BlobService.dll) e uno all'assembly Microsoft.WindowsAzure.StorageClient.dll.

Poiché quest'ultimo ha un riferimento all'assembly System.Web, dobbiamo assicurarci che la versione target del Framework sia la full e non la Client Profile (per cambiarla: My Project -> Compile -> Advanced compile options).

L'applicazione sostanzialmente si propone di elencare i container disponibili, di elencare i blob disponibili per container e di caricare/scaricare/rimuovere alcuni blob. I metodi della classe BlobService restituiscono IEnumerable(Of T), dove T sarà CloudBlobContainer per le folder e CloudBlob per i file. Restituendo questo particolare tipo, diventano i candidati ideali per alcuni ItemControl di WPF, uno fra tutti la DataGrid. Ecco quindi come lo XAML definisca due griglie, una che mostra i container e una che mostra i blob:

    <Grid>
        <DataGrid AutoGenerateColumns="False" Height="168" HorizontalAlignment="Left" Margin="7,8,0,0" Name="DataGrid1" VerticalAlignment="Top" Width="486" ItemsSource="{Binding}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Uri" Binding="{Binding Path=Uri, Mode=OneWay}" Width="SizeToCells"/>
                <DataGridTextColumn Header="Name" Binding="{Binding Path=Name, Mode=OneWay}" Width="SizeToCells"/>
            </DataGrid.Columns>
        </DataGrid>
        <DataGrid AutoGenerateColumns="False" Height="182" HorizontalAlignment="Left" Margin="7,185,0,0" Name="DataGrid2" VerticalAlignment="Top" Width="487" ItemsSource="{Binding}" >
            <DataGrid.Columns>
                <DataGridHyperlinkColumn Header="Uri" Binding="{Binding Path=Uri, Mode=OneWay}" Width="SizeToCells">
                    <DataGridHyperlinkColumn.ElementStyle>
                        <Style TargetType="TextBlock">
                            <EventSetter Event="Hyperlink.Click" Handler="HyperlinkClick" />
                        </Style>
                    </DataGridHyperlinkColumn.ElementStyle>
                </DataGridHyperlinkColumn>
            </DataGrid.Columns>
        </DataGrid>
        <Button Content="Upload all pics" Height="37" HorizontalAlignment="Left" Margin="9,387,0,0" Name="UploadButton" VerticalAlignment="Top" Width="116" />
        <Button Content="Remove all blobs" Height="39" HorizontalAlignment="Left" Margin="132,387,0,0" Name="RemoveButton" VerticalAlignment="Top" Width="118" />
        <Button Content="Download all blobs" Height="37" HorizontalAlignment="Left" Margin="258,387,0,0" Name="DownloadButton" VerticalAlignment="Top" Width="115" />
    </Grid>

Nella DataGrid dei blob si usa un HyperLink che punta alla proprietà Uri di ciascun elemento. Chiaramente il data-binding va a prendere solo le proprietà di interesse da mostrare nelle DataGrid, ma potete modificarlo. Giusto per scopo dimostrativo, che poi potete estendere per vostro conto, c'è un pulsante che carica tutte le immagini nella cartella My Pictures. Lato VB, dapprima definiamo l'istanza della classe di servizio e collezioni che ci servono per il binding:

Imports Microsoft.WindowsAzure.StorageClient
Imports System.Collections.ObjectModel

Class MainWindow

    Private containerCollection As ObservableCollection(Of CloudBlobContainer)
    Dim bService As New DelSole.BlobService.BlobService
    Dim blobCollection As ObservableCollection(Of CloudBlob)

L'istanza della classe di servizio creata senza passare argomenti al costruttore fa riferimento al development storage locale. Fatto questo ci assicuriamo, al caricamento della finestra principale, che l'emulatore locale sia in esecuzione e poi carichiamo dallo storage i vari container, associati alla prima DataGrid:

    Private Sub MainWindow_Loaded(ByVal sender As ObjectByVal e As System.Windows.RoutedEventArgs) _
                Handles Me.Loaded
        DelSole.BlobService.BlobService.CheckIfDevelopmentStorageIsRunning()

        Me.containerCollection = New ObservableCollection(Of CloudBlobContainer)(bService.ListContainers)
        Me.DataGrid1.ItemsSource = bService.ListContainers.ToList
    End Sub

Gestiamo poi il caricamento della lista di blob per container, che si verifica quando viene selezionato un container nell'apposita DataGrid:

    Private Sub DataGrid1_SelectionChanged(ByVal sender As Object,
                                           ByVal e As System.Windows.Controls.SelectionChangedEventArgs) _
                                           Handles DataGrid1.SelectionChanged
        Me.blobCollection = New ObservableCollection(Of CloudBlob)(bService.ListBlobs(CType(Me.DataGrid1.SelectedItem, CloudBlobContainer).Name))
        Me.DataGrid2.ItemsSource = Me.blobCollection
    End Sub


    Private Sub HyperlinkClick()
        Process.Start(CType(Me.DataGrid2.SelectedItem, CloudBlob).Uri.ToString)
    End Sub

 Il metodo HyperlinkClick sfrutta i relaxed delegate e va ad aprire il contenuto del blob selezionato, a seguito di un cast da Object a CloudBlob. Infine i gestori per i tre pulsanti; il primo carica il contenuto della cartella My Pictures (questo è fatto per brevità, potreste sostituire con una OpenFileDialog e scegliere ciò che preferite), il secondo cancella i blob, il terzo li scarica in una cartella predeterminata:

La seguente figura mostra un esempio dell'applicazione in esecuzione:

Sfruttando quindi l'interazione client con lo storage di Azure è possibile memorizzare e gestire i propri dati in maniera totalmente managed. Eh si, in Visual Basic ;-)

Alessandro

Print | posted on domenica 23 gennaio 2011 16:44 | Filed Under [ Visual Basic Visual Studio 2010 Windows Azure and SQL Azure ]

Powered by:
Powered By Subtext Powered By ASP.NET