Procédure pas à pas : créer un objet de service de contenu
Dernière modification : mercredi 30 septembre 2009
S’applique à : SharePoint Foundation 2010
Dans cet article
Fichier de classe ContentService
Fichier de classe ContentLocationCollection
Fichier de classe ContentLocation
Ajouter une action personnalisée et des pages ASPX
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 SharePoint Foundation. 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 SharePoint Foundation 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.
Notes
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 : modifier l’interface utilisateur à l’aide d’actions personnalisées.
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 SharePoint Foundation.