Share via


Procédure pas à pas : créer un objet de service de contenu

Cette procédure pas à pas explique comment définir la logique d'un service personnalisé pour gérer un contenu de site dans un déploiement Windows SharePoint Services. L'exemple montre comment créer des classes qui dérivent de classes dans l'espace de noms Microsoft.SharePoint.Administration pour conserver les paramètres d'administration personnalisés dans la base de données. L'exemple comprend les fichiers de classe qui implémentent les structures de données contenant les métadonnées sur une liste d'emplacements. Chaque emplacement de contenu spécifie une URL qui doit être conservée.

L'exemple comprend la création de fichiers de code pour les classes suivantes :

  • ContentService   Définit l'objet de niveau supérieur qui dérive de la classe SPService et fournit la logique de gestion des emplacements de contenu dans un déploiement. Cette classe comprend des constructeurs pour l'initialisation de l'objet ContentService, ainsi que des membres pour la récupération du service de contenu et de sa collection d'emplacements de contenu.

  • ContentLocationCollection   Définit une classe de collections qui hérite de la classe SPPerisistedChildCollection et fournit un objet destiné au stockage des emplacements de contenu. Cette classe contient un constructeur et une méthode Add.

  • ContentLocation   Hérite de SPPersistedObject et définit un emplacement de contenu. Cette classe comprend des constructeurs et des membres pour les paramètres de propriétés personnalisées.

Outre la création d'un assembly avec les fichiers de code précédents, l'exemple illustre l'utilisation d'un composant fonctionnel d'action personnalisée pour ajouter sur la page Opérations un lien permettant aux administrateurs d'accéder au service. L'exemple décrit également comment utiliser des pages .aspx personnalisées pour fournir l'interface utilisateur nécessaire à la gestion du service de contenu et de ses éléments d'emplacement de contenu. Pour plus d'informations sur la création d'un projet Windows SharePoint Services dans Microsoft Visual Studio 2005, voir Mise en route de la personnalisation par programme d'un site Web SharePoint dans Visual Studio.

Fichier de classe ContentService

L'exemple de code suivant définit une énumération FormatType et la classe ContentService de niveau supérieur, qui comprend des constructeurs et les membres suivants :

  • Local   Propriété statique permettant de récupérer le service d'emplacement de contenu actuel.

  • Locations   Propriété statique permettant d'accéder à la collection d'emplacements de contenu.

  • GetAllContentLocations   Méthode permettant de retourner tous les emplacements de contenu fournis par le biais du service.

  • Format   Propriété permettant d'obtenir ou de définir le type de format du service de contenu.

Au début de chaque fichier de code présenté ci-après, ajoutez une directive permettant d'importer l'espace de noms Microsoft.SharePoint.Administration, comme dans l'exemple suivant. Utilisez l'attribut Persisted pour conserver les paramètres de propriété dans la base de données. L'espace de noms personnalisé qui contient des objets dans l'exemple est nommé MS.Samples.SharePoint.ContentManager.

Imports System
Imports System.Collections.Generic
Imports System.Text
Imports Microsoft.SharePoint.Administration

Namespace MS.Samples.SharePoint.ContentManager

    Public Enum FormatType
        HTML
        XML
    End Enum 'ContentLocationType

    <System.Runtime.InteropServices.Guid("BB69A6EB-3230-43ca-B4F5-752EAC39C74A")>  _
    Public Class ContentService
        Inherits SPService

        <Persisted()>  _
        Private formatType As FormatType

        Private Shared locations As ContentLocationCollection
        Private Shared local As ContentService = Nothing
      
        ' A static property that retrieves the content service. 
        Public Shared ReadOnly Property Local() As ContentService
            Get
                If ContentService.local Is Nothing Then
                    ContentService.local = _
                      SPFarm.Local.Services.GetValue < ContentService > "ContentService"
                End If

                Return ContentService.local
            End Get
        End Property

        ' A static property for accessing the location collection. 
        Public Shared ReadOnly Property Locations() As ContentLocationCollection
            Get
                If Me.locations Is Nothing Then
                    Me.locations = New ContentLocationCollection(Me)
                End If

                Return Me.locations
            End Get
        End Property

        ' An empty public constructor required for serialization. 
        Public Sub New()
        End Sub 'New

        Public Sub New(farm As SPFarm)
            MyBase.New("ContentService", farm)
            ' Add code to initialize as needed. 
        End Sub 'New

        ' A method to retrieve the content location collection. 
        Public Function GetAllContentLocations() As ContentLocationCollection
            Dim service As ContentService = ContentService.Local
            If service Is Nothing Then
                Return Nothing
            End If

            Return service.Locations
        End Function 'GetAllContentLocations

        Public Property Format () As FormatType
            Get
                Return Me.formatType
            End Get
            Set
                Me.formatType = value
            End Set
        End Property 
    End Class 'ContentService
End Namespace 'MS.Samples.SharePoint.ContentManager
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint.Administration;

namespace MS.Samples.SharePoint.ContentManager
{
    public enum FormatType
    {
        HTML,
        XML
    }
    [System.Runtime.InteropServices.Guid("BB69A6EB-3230-43ca-B4F5-752EAC39C74A")]
    public class ContentService : SPService
    {
        [Persisted]
        private FormatType formatType;

        private static ContentLocationCollection locations;
        private static ContentService local = null;

        /* A static property that retrieves the content service. */
        public static ContentService Local
        {
            get
            {
                if (ContentService.local == null)
                {
                    ContentService.local = 
                      SPFarm.Local.Services.GetValue<ContentService>("ContentService");
                }

                return ContentService.local;
            }
        }

        /* A static property for accessing the location collection. */
        public static ContentLocationCollection Locations
        {
            get
            {
                if (this.locations == null)
                {
                    this.locations = new ContentLocationCollection(this);
                }

                return this.locations;
            }
        }

        /* An empty public constructor required for serialization. */
        public ContentService()
        {;}

        public ContentService(SPFarm farm)
            : base("ContentService", farm)
        {/* Add code to initialize as needed. */}

        /* A method to retrieve the content location collection. */
        public ContentLocationCollection GetAllContentLocations()
        {
            ContentService service = ContentService.Local;

            if (service == null)
            {
                return null;
            }

            return service.Locations;
        }

        public FormatType Format
        {
            get 
            {
                return this.formatType; 
            }
            set 
            { 
                this.formatType = value; 
            }
        }
    }
}

Définissez une méthode Provision personnalisée afin d'ajouter l'objet ContentService à la base de données, comme dans l'exemple suivant. Cette méthode peut figurer dans la classe ContentService précédente, ou être conservée à part afin qu'elle soit plus modulaire et puisse être appelée plus facilement à partir de différents contextes, tels qu'une opération de ligne de commande ou un programme d'installation de composant fonctionnel que vous pouvez créer pour installer le service. La méthode Provision ajoute l'objet ContentService à la base de données sans que vous deviez spécifier l'assembly et la classe.

RemarqueRemarque :

La méthode Provision personnalisée que vous définissez n’est pas la méthode Provision de la classe SPPersistedObject de base.

Public Sub Provision()
  ' Add the ContentService administration object to the database.
  Dim contentService As ContentService = ContentService.Local
  
  If contentService Is Nothing Then
    contentService = New ContentService(SPFarm.Local)
    contentService.Update()
  End If
End Sub
public void Provision()
{
    /* Add the ContentService administration object to the database. */
    ContentService contentService = ContentService.Local;

    if (contentService == null)
    {
        contentService = new ContentService(SPFarm.Local);
        contentService.Update();
    }
}

Fichier de classe ContentLocationCollection

L'exemple suivant définit la classe ContentLocationCollection qui comprend les constructeurs et une méthode Add permettant d'ajouter de nouveaux emplacements de contenu à la collection.

Public Class ContentLocationCollection

  Public Sub New(parent As SPPersistedObject)
    MyBase.New(parent)
  End Sub
  
  Public Sub Add(url As String)
    Dim location As New ContentLocation(String.Empty, Me.Parent)
    
    location.Url = url
    
    location.Update()
  End Sub
End Class
public class ContentLocationCollection : SPPersistedChildCollection<ContentLocation>
{
    public ContentLocationCollection(SPPersistedObject parent) : base(parent)
    {;}

    public void Add(String url)
    {
        ContentLocation location = new ContentLocation(String.Empty, this.Parent);

        location.Url = url;

        location.Update();
    }
}

Fichier de classe ContentLocation

L'exemple suivant définit une énumération ContentLocationType qui spécifie le type d'emplacement de contenu, ainsi qu'une classe ContentLocation qui définit les propriétés d'un emplacement de contenu, notamment ses nom complet, type, URL et chemin de sortie. La spécification de l'attribut Persisted conserve un paramètre de propriété dans la base de données.

La classe ContentLocation comprend les membres suivants :

  • DisplayName   Propriété permettant d'obtenir le nom complet de l'emplacement.

  • Url   Propriété permettant d'obtenir ou de définir l'URL d'un emplacement de contenu.

  • LocationType   Propriété permettant d'obtenir ou de définir le type d'emplacement.

  • ContentOutputPath   Propriété permettant d'obtenir ou de définir un chemin de sortie.

Public Enum ContentLocationType
    Web
    List
End Enum 'ContentLocationType

Public Class ContentLocation
  Inherits SPPersistedObject
    <Persisted()>  _
    Private locationType As ContentLocationType

    <Persisted()>  _
    Private contentOutputPath As String

    <Persisted()>  _
    Private url As String

    Public Sub New()
    End Sub 'New

    Public Sub New(name As String, parent As SPPersistedObject)
        MyBase.New(name, parent)
    End Sub 'New

    Public Overrides ReadOnly Property DisplayName() As String
        Get
            Return Me.url
        End Get
    End Property

    Public Property Url() As String
        Get
            Return Me.url
        End Get
        Set
            If Me.url = value Then
                Return
            End If

        Me.url = value

        ' The Name property must be unique among multiple children in a 
        ' collection.  Use the URL to ensure uniqueness. 
         Me.Name = Me.url
        End Set
    End Property
      
    Public Property LocationType() As ContentLocationType
        Get
            Return Me.locationType
        End Get
        Set
            Me.locationType = value
        End Set
    End Property 
      
    Public Property ContentOutputPath() As String
        Get
            Return Me.contentOutputPath
        End Get
        Set
            Me.contentOutputPath = value
        End Set
    End Property
End Class 'ContentLocation
public enum ContentLocationType
{
    Web,
    List
}

public class ContentLocation : SPPersistedObject
{
    [Persisted]
    private ContentLocationType locationType;

    [Persisted]
    private String contentOutputPath;

    [Persisted]
    private String url;

    public ContentLocation()
    {}

    public ContentLocation(string name, SPPersistedObject parent)
      : base(name, parent)
    {;}

    public override string DisplayName
    {
        get
        {
            return this.url;
        }
    }

    public String Url
    {
        get { return this.url; }
        set 
        {
            if (this.url == value)
            {
                return;
            }

            this.url = value;
            /* The Name property must be unique among multiple children in a collection.  Use the URL to ensure uniqueness. */
            this.Name = this.url; 
        }
    }

    public ContentLocationType LocationType
    {
        get { return this.locationType; }
        set { this.locationType = value; }
    }

    public String ContentOutputPath
    {
        get { return this.contentOutputPath; }
        set { this.contentOutputPath = value; }
    }
}

Ajouter une action personnalisée et des pages ASPX

Ajoutez des pages .aspx au dossier \Admin et définissez leur code-behind dans votre assembly. Pour plus d'informations sur les pages .aspx d'administration, voir Pages de l'Administration centrale. Utilisez un composant fonctionnel pour ajouter une action personnalisée à une page de l'Administration centrale. Pour plus d'informations sur l'ajout d'une action personnalisée, voir Procédure : ajouter des actions à l'interface utilisateur.

Le fichier Elements.xml suivant ajoute, à la section Configuration globale de la page Opérations, une action personnalisée Content export qui pointe vers une page contentman.aspx permettant de gérer les emplacements de contenu.

<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
  <CustomAction
    Id="ContentManagement"
    GroupId="GlobalConfiguration"
    Location="Microsoft.SharePoint.Administration.Operations"
    Sequence="31"
    Title="Content export">
    <UrlAction Url="/_admin/contentman.aspx" />
  </CustomAction>
</Elements>

Le fichier contentman.aspx vers lequel pointe l'action personnalisée peut comprendre des liens vers des pages de formulaire facilitant la création, l'affichage ou la modification des éléments d'emplacement de contenu. Le code-behind associé à la page Nouvel élément, par exemple, peut comprendre une logique telle que la suivante, qui ajoute des éléments d'emplacement pour les URL tapées dans une zone urlImportExport de la page et qui opère une redirection vers la page contentman.aspx :

Imports System
Imports System.Collections.Generic
Imports System.Text
Imports Microsoft.SharePoint.WebControls
Imports System.Web.UI
Imports System.Web.UI.WebControls

Namespace MS.Samples.SharePoint.ContentManager

    Public Class NewContentImportExportPage
        Inherits Page
        Protected urlImportExport As InputFormTextBox

        Protected Sub SaveNewImportExport(sender As Object, eventArgs As EventArgs)
            Dim service As ContentService = ContentService.Local

            service.Locations.Add(Me.urlImportExport.Text)

            Response.Redirect("/_admin/contentman.aspx", True)
        End Sub 'SaveNewImportExport
    End Class 'NewContentImportExportPage
End Namespace 'MS.Samples.SharePoint.ContentManager
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint.WebControls;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MS.Samples.SharePoint.ContentManager
{
    public class NewContentImportExportPage : Page
    {
        protected InputFormTextBox urlImportExport;

        protected void SaveNewImportExport(object sender, EventArgs eventArgs)
        {
            ContentService service = ContentService.Local;

            service.Locations.Add(this.urlImportExport.Text);

            Response.Redirect("/_admin/contentman.aspx", true);
        }
    }
}

Après avoir implémenté votre service personnalisé, vous pouvez accéder à ses données en l'instanciant et en appelant ses membres. Vous pouvez également créer d'autres objets personnalisés qui héritent d'autres objets persistants dans l'espace de noms Microsoft.SharePoint.Administration. Vous pouvez créer une classe, par exemple, qui dérive de la classe SPJobDefinition pour implémenter un travail de minuteur et effectuer des opérations chronométrées via votre service personnalisé, ou vous pouvez hériter de la classe SPFeatureReceiver pour définir la gestion d'événements afin d'inscrire le service lorsqu'il est installé ou activé en tant que composant fonctionnel.

Par le biais d'objets persistants, vous pouvez ajouter des objets d’administration personnalisée à la base de données de configuration afin de conserver la logique et les données d'une application Web basée sur la plateforme Windows SharePoint Services.