working in progress: SharePoint 2010, Visual Studio 2010, ASP.NET, WPF, Scrum, Patterns, TDD, Refactorin To Pattern

2711/09 0

Guida SharePoint – Gestire la Versioning della Document Library

Con SharePoint 2007 abbiamo a disposizione il totale supporto del versioning degli item.

Tramite la classe SPFile abbiamo quattro metodi che ci tornano utili:

ecco un esempio:

 

namespace Versioning
{
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SharePoint;

    class Program
    {
        static void Main(string[] args)
        {
            SPSite site = new SPSite("http://mysite");
            SPWeb web = site.AllWebs["Test Site"];
            SPList docLib = web.Lists["Documents"];
            
            SPFolder folder = docLib.RootFolder;
            SPFile theFile = folder.Files["Documents/test.txt"];

            theFile.CheckOut();
            theFile.SaveBinary(
                ASCIIEncoding.Default.GetBytes("Testo inserito tramite programma."));
            theFile.Update();
            theFile.CheckIn("File modificato.");

            Console.ReadLine();
        }
    }
}

 

Ricordiamoci che dentro la SPFolder ha una proprità di nome SubFolders tramite la quale possiamo ottenere tutte subfolders.

 

Virtualmente tutte le liste possono contenere folders e subfolders e possiamo creare un content type per le nostre folder.

I metodi più usati della classe SPFolder sono:

Mentre quelle della classe SPFile sono:

 

Ciao

[top]

2611/09 0

Differenze tra ListBox e ListView

Mi e vi segnalo un post su StackOverflow sulle differenze tra ListBox e ListView...

spero così di non dimenticarmele più:

 

http://stackoverflow.com/questions/227231/wpf-listbox-vs-listview-how-to-choose-for-data-binding

 

Ciao

[top]

2511/09 0

Model View Presenter

Secondo Wikipedia questo pattern nasce nei primi anni ‘90, da una joint venture fra Apple, IBM e HP.

Altre fonti identificano Mike Potel come ideatore di questo pattern.

L’idea alla base era quella di dividere ulteriormente i layer, creando delle model che siano adattabimi nelle applicazioni multi-tier e multi-client/server.

Rispetto all’MVC i vantaggi di MVP sono:

  • un ulteriore vantaggio nei test, creando delle classi mock
  • una separazione tra i DTO e la View
  • la View è un entità che chiunque può usare, basta che ne conosce l’interfaccia

Per un elenco completo dei vantaggi/svantaggio tra MVP e MVC mi consiglio il seguente articolo: Model View Presenter (MVP) VS Model View Controller (MVC)

 

Martin Fowler segnala due possibili implementazioni dell’MVP:

  1. Supervising Controller
  2. Passive View

 

Quì potete trovare tante implementazioni di patterns MVC e MVP.

Personalmente mi sono sempre trovato bene con il pattern MVP – Passive View sia su applicazioni WinForm che ASP.NET.

Ciao

[top]

2311/09 0

Guida SharePoint – Lavorare con le Document Libraries

Precedenti post:

 

Le Document Libraries sono il cavallo di battaglia di MOSS.
Molte realtà utilizzano MOSS solamente per le Document Libraries.

 

Le Basi

Le Document Libraries è un’altro tipo di list di SharePoint la quale implementa una serie di funzionalità non presenti nelle altre liste.

Per poter accedere alle liste di questo tipo possiamo utilizzare le, già viste, SPList e la classe SPListItem per i suoi item oppure, se volessimo usare qualcosa di più specifico di questa lista, allora possiamo usare le classi specializzate, SPDocumentLibrary e SPFile.

Tramite le classi specializzate abbiamo la possibilità di utilizzare al meglio la Document Libraries; ad esempio l’SPFile espone più metodi per la gestione del versioning degli item.

 

Document Library Object Model

L’object model a supporto per la gestione delle Document Libraries sono:

Le classi SPFile e SPFolder espongono ottime funzionalità per la gestione delle directory e dei file all’interno della lista.

 

namespace DocLibrary
{
    using System;

    class Program
    {
        static void Main(string[] args)
        {
            // siteUrl
            SPSite sourceSite = new SPSite(args[0]);
            // siteName
            sourceWeb = sourceSite.AllWebs[args[0]];

            foreach (SPList theList in sourceWeb.Lists)
                if (theList is SPDocumentLibrary)
                    Console.WriteLine(theList.Title);
        }
    }
}

Buona Document Library ;D

[top]

2011/09 0

Guida SharePoint – Deploy Event Receiver

Precedenti post:

 

Gli event receiver possono essere deployiate in 3 da:

  • Programma
  • Feature
  • Content type

 

Programma

Se si vuole associare il proprio event receiver ad una sola instanza di una lista invece che a tutte le liste, possiamo registrare il nostro event receiver programmaticamente:

 

SPWeb webSite = new SPSite("http://win2k3r2lab").OpenWeb();
SPList theList = webSite.Lists["Tasks"];
SPEventReceiverDefinition newReceiver = theList.EventReceivers.Add();
newReceiver.Class = "Receiver.ReceiverClass";
newReceiver.Assembly = "Receiver,Version=1.0.0.0,Culture=neutral,PublicKeyToken=abc123abc123abc";

newReceiver.Sequence = 5000;
newReceiver.Type = SPEventReceiverType.ItemUpdated;
newReceiver.Update();

 

da notare dalla 6 alla 8 per associare l’event receiver alla lista.

 

 

Feature

Deployiando tramite Feature, abbiamo la possibilità di associare gli event receivers al tipo di lista sulle quali vogliamo lavorare, specificando l’ID del template della lista.
Ecco un esempio:

Feature.xml


   
     
   

 

Elements.xml


    
        
            EventLogger
            ItemAdded
            10000
            EventLogger, Version=1.0.0.0, Culture=neutral,PublicKeyToken=5d1d751131e0aacf
            EventLogger.ListEventLogger
            
            
        
        
            EventLogger
            ItemUpdated
            10000
            EventLogger, Version=1.0.0.0, Culture=neutral,PublicKeyToken=5d1d751131e0aacf
            EventLogger.ListEventLogger
            
            
        
        
            EventLogger
            ItemDeleted
            10000
            EventLogger, Version=1.0.0.0, Culture=neutral,PublicKeyToken=5d1d751131e0aacf
            EventLogger.ListEventLogger
            
            
        
    

 

Per una lista completa degli ID dei list template fate riferimento alle msdn.

 

Content Type

Deployiare il tutto tramite i content type segue la stessa logica del deploiare una feature.
Bisognerà quindi creare una dll con strongly name, firmare l’assembly e salvarlo in GAC del server di destinazione.

 

Ciao

[top]

1911/09 0

SharePoint 2010 Beta e Office 2010 Beta

Finalmente è pubblica la beta di SharePoint 2010 a questo indirizzo:

http://sharepoint2010.microsoft.com/Pages/default.aspx

mentre potete scaricare Office 2010 beta da quest’altro indirizzo:

http://www.microsoft.com/office/2010/en/default.aspx

 

Per tutti gli altri prodotti 2010 fate pure riferimento all'url: http://www.microsoft.com/2010/en/

 

Buon download

[top]

1811/09 0

Guida SharePoint – Gestione degli eventi delle liste

Precedenti post:

 

Gli eventi sono un’altro aspetto interessante di SharePoint 2007.
Già presenti nelle versioni precedenti, erano limitate alle document libraries, vedono la loro espansione in questa versione di SharePoint.

Gli eventi vengono generati per svariarti motivi:

  • Modifica di list items
  • Creazione di una nuova list
  • Nuova list items
  • Rimozione list items
  • etc

Per una lista completa degli eventi gestiti potete fare riferiemnto alle msdn.

Per poter creare un receiver correttamente funzionante dovremo deploiare in GAC una libreria .NET strong-typed e far derivare la nostra classe da una classe EventReceiver sulla quale dovremo lavoare, ad esempio: SPItemEventReceiver o SPListEventReceiver.
Entrambe derivano dalla classe abstract SPEventReceiverBase.

Creazione di un Event Receivers

Creare un event receivers è semplicissimo. Si può riassumere tutto in 4 passi:

  1. Creare una classe che eredita dalla SPListEventReceiver o dalla SPItemEventReceiver
  2. Firmare la libreria con uno strong name
  3. Deploiare la libreria nella Global Assembly Cache
  4. Deploiare l’event receiver tramite una feature, con unc ontent type etc etc

 

Creazione di un event receiver per una lista

Un evento sulla lista viene generato quando un metadato della lista viene modificato.
Ad esempio potremmo creare un receiver che si attiva quando un campo viene aggiunto o rimosso dalla lista.

Possiamo stare in ascolto e ricevere una notifica, sia allo scaturirsi (FieldAdding) dell’evento che subito dopo che l’evento è stato scaturito (FieldAdded).

Tutti gli eventi accettano un parametro che è l’SPListEventProperties fate riferimento alla pagina msdn per l’elenco delle proprietà.

Prima di creare l’event receiver, accertiamoci d’aver installato VSeWSS se lavoriamo con Visual Studio 2008.
Se è installato creiamo un nuovo progetto di tipo Empty:

Ee354190.78a199f6-8a8f-4d69-9194-eb7018c7c6ed(en-us,office.12)

e inserite il seguente codice:

 

namespace ListMetaLogger
{
    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SharePoint;
    public class ListMetaLogger : SPListEventReceiver
    {
        public override void FieldAdded(SPListEventProperties properties)
        {
            LogEvent(properties, "FieldAdded");
        }
        public override void FieldAdding(SPListEventProperties properties)
        {
            LogEvent(properties, "FieldAdding");
        }
        public override void FieldDeleting(SPListEventProperties properties)
        {
            LogEvent(properties, "FieldDeleting");
        }
        public override void FieldDeleted(SPListEventProperties properties)
        {
            LogEvent(properties, "FieldDeleted");
        }
        public override void FieldUpdated(SPListEventProperties properties)
        {
            LogEvent(properties, "FieldUpdated");
        }
        public override void FieldUpdating(SPListEventProperties properties)
        {
            LogEvent(properties, "FieldUpdating");
        }
        private void LogEvent(SPListEventProperties properties, string eventName)
        {
            StreamWriter sw = File.AppendText(@"C:\listeventlog.txt");
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("[{0}] {1} Event Occurred:\n", DateTime.Now.ToString(), eventName);
            sb.AppendFormat("\tList : {0}", properties.ListTitle);
            sb.AppendFormat("\t{0} - Field {1}", properties.EventType.ToString(), properties.FieldName);
            sw.WriteLine(sb.ToString());
            sw.Close();
        }
    }
}

 

Il codice di sopra genererà un file C:\listeventlog.txt il quale conterrà l’elenco di tutti gli eventi scaturiti dalle liste.

 

Creazione per un event receivers per gli Items

La gestione degli eventi sugli item è uguale a quella delle liste.
Negli eventi scaturiti la classe con cui lavoreremo sarà la SPItemEventProperties:

 

namespace EventLogger
{
    using System;
    using System.IO;
    using Microsoft.SharePoint;

    public class ListEventLogger : SPItemEventReceiver
    {
        public override void ItemAdded(SPItemEventProperties properties)
        {
            WriteTextToLog(string.Format("[{0}] Item Added : {1}", properties.ListItem.Title, DateTime.Now.ToString()));
        }
        public override void ItemDeleted(SPItemEventProperties properties)
        {
            WriteTextToLog(string.Format("[{0}] Item Deleted : {1}", properties.ListItem.Title, DateTime.Now.ToString()));
        }
        public override void ItemUpdated(SPItemEventProperties properties)
        {
            WriteTextToLog(string.Format("[{0}] Item Updated : {1}", properties.ListItem.Title, DateTime.Now.ToString()));
        }
        private void WriteTextToLog(string text)
        {
            StreamWriter logFile = File.AppendText(@"C:\listlog.txt");
            logFile.Write(text + "\n");
            logFile.Close();
        }
    }
}

 

Da notare che potremmo bloccare, ad esempio, l’update di un item nella lista settando a true la proprietà Cancel.

 

Nel prossimo post vedremo come effettuare il deploy di queste librerie.

[top]

1711/09 0

Model View Controller le origini

C’è un pò (tanta) confusione intorno ai pattern di separation of concerns.

Con i seguenti post provo a chiarire e spero di non aprire dei dibattiti infiniti.

Il primo pattern che andrò a spulciare è quello che potremmo definire: classic MVC

Com’è possibile anche leggere da Wikipedia, questo pattern nasce nel 1979 grazie ad un’idea di Trygve Reenskaug il quale lavorava su Smalltalk.

L’idea alla base è quella di dividere i compiti delle applicazioni in layer, in modo tale da ottenere una chiara divisione tra il domain object e la sua rappresentazione, introducendo così il meccanismo denominato Observer-Synchronization, il quale permette di rappresentare in più punti della nostra applicazione lo stesso domain object senza che questo si preoccupi della sua rappresentazione.

 

I Layer

Model

Rappresenta il domain object. Può esser ricavata da uno o più DAL gestiti dall’applicazione, ciò significa che i suoi dati possono esser ricavati da un database, da un file xml, da un file testuale o da tutti e tre contemporaneamente.
Non esiste un rapporto 1-a-1 con il Controller o con la View.

View

Visualizza la Model. Può essere una Windows Form, una pagina ASPX, come può essere un file di testo o un file XML.
La View comunica direttamente con la Model.

Controller

Interpreta gli input dell’utente (mouse, tastierta etc), notifica l’input alla model e/o cambia la view con quella corretta.

 

Questa è l’immagine che ho trovato che meglio rappresenta questa logica:

Seguiamo l’immagine di sopra:

  1. Il controller riceve un input da parte dell’utente
  2. Se l’input è valido il comando viene girato alla model
  3. La model cambia stato
  4. La view riceve la notifica del cambio di stato
  5. La view visualizza i dati della model

Ok, questa era l’implementazione classica, vedremo le altre implementazioni nei prossimi post.

Se volete altre informazioni fate riferimento pure alle msdn.

Ciao

[top]

1711/09 0

Fine Evento Community Tour Bologna: Tiriamo le somme

La sessione su ASP.NET MVC tenuta in quel di Bologna grazie al supporto di DotDotNet, si è conclusa ieri.

Voglio ringraziare, in ordine sparso, per il loro supporto:

e tutti coloro che sto dimenticando.

Io e Ugo speriamo di poter ripetere il tutto anche in altre parti d'Italia (community fatevi vive) e, personalmente, spero di poter proporre anche sessioni su SharePoint.

 

 

 

 

 

 

 

Grazie e alla prossima

[top]

1611/09 0

Guida SharePoint – I content type. Cosa sono e come utilizzarli.

Precedenti post:

 

I Content Type (CT) sono un’altra caratteristica nata con SharePoint 2007.
Come il nome suggerisce, definiscono il tipo contenuto dalle librerie presenti sui nostri SharePoint site.
Aiutandoci con le definizioni trovate nelle msdn possiamo dire che: I Content Types fanno parte dei nuovi concetti chiave di Windows SharePoint Service 3.0 utilizzati per tutte le funzionalità e i servizi offerti.

Il concetto dietro i content type è la creazione di collezioni di settaggi riusabili i quali permettono di lavorare sui metadati e il comportamento dei documenti/item in un modo centralizzato e riusabile.

I content type tornano utili quando vogliamo salvare/visualizzare nella stessa list o document library più tipi differenti.

Fate riferimento a questo link: http://office.microsoft.com/en-us/sharepointtechnology/HA100974931033.aspx per la creazione di un nuovo Content Type.

Una delle capacità dei CT è l’ereditarietà.
Potremmo creare un nuovo CT ereditando, ad esempio, dal tipo Folder in modo da aggiungere i settaggi che ci tornano utili per la nostra lista.
Possiamo fare riferimento alla seguente immagine, prelevata da Creating Content Types Based on Other Content Types:

Il nuovo tipo creato, il quale ha ereditato il CT Folder, potrebbe dividere gli items all’interno della lista per folders cliente.

Nel qual caso per ottenere gli items all’interno della folder faremo:

 

namespace ConsoleApplication1
{
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SharePoint;

    class Program
    {
        static void Main(string[] args)
        {
            SPSite site = new SPSite(args[0]);
            SPWeb web = site.AllWebs["Web Test"];
            SPList parentList = web.Lists["Clienti"];
            foreach (SPListItem order in parentList.Folders)
            {
                Console.WriteLine("Ordine       : {0}", order["Nome"]);
                Console.WriteLine("Numero       : {0}", order["Numero ordine"]);
                SPQuery orderItemsQuery = new SPQuery();
                orderItemsQuery.Folder = order.Folder;
                SPListItemCollection orderItems = parentList.GetItems(orderItemsQuery);
                foreach (SPListItem orderItem in orderItems)
                {
                    Console.WriteLine("Item {0}: {1} {2}",
                    orderItem["OrderItem"],
                    orderItem["SKU"],
                    orderItem["Title"]);
                }
            }
            Console.ReadLine();
        }
    }
}

 

Enjoy

[top]