Exemplarische Vorgehensweise: Erstellen eines Dienstobjekts für die Inhaltsverwaltung

Letzte Änderung: Mittwoch, 30. September 2009

Gilt für: SharePoint Foundation 2010

Inhalt dieses Artikels
ContentService-Klassendatei
ContentLocationCollection-Klassendatei
ContentLocation-Klassendatei
Hinzufügen einer benutzerdefinierten Aktion und von ASPX-Seiten

In dieser exemplarischen Vorgehensweise wird erläutert, wie die Logik für einen benutzerdefinierten Dienst zum Verwalten von Websiteinhalten in einer SharePoint Foundation-Bereitstellung definiert wird. Im Beispiel wird das Erstellen von Klassen veranschaulicht, die von Klassen im Microsoft.SharePoint.Administration-Namespace abgeleitet sind, sodass benutzerdefinierte Administratoreinstellungen in der Datenbank erhalten bleiben. Das Beispiel enthält Klassendateien, die Datenstrukturen mit Metadaten zu einer Liste von Speicherorten implementieren. Jeder Inhaltsspeicherort gibt dabei eine URL an, die beibehalten werden muss.

Im Beispiel werden Codedateien für die folgenden Klassen erstellt:

  • ContentService: Definiert das Objekt der obersten Ebene, das von der SPService-Klasse abgeleitet ist und die Logik zum Verwalten von Inhaltsspeicherorten in einer Bereitstellung angibt. Diese Klasse enthält Konstruktoren zum Initialisieren des ContentService-Objekts sowie Member zum Abrufen des Inhaltsdiensts und der zugehörigen Auflistung von Inhaltsspeicherorten.

  • ContentLocationCollection: Definiert eine Auflistungsklasse, die von der SPPerisistedChildCollection-Klasse erbt und ein Objekt angibt, das die Inhaltsspeicherorte enthält. Diese Klasse enthält einen Konstruktor und eine Add-Methode.

  • ContentLocation: Erbt von SPPersistedObject und definiert einen Inhaltsspeicherort. Diese Klasse enthält Konstruktoren und Member für benutzerdefinierte Eigenschaftseinstellungen.

Zusätzlich zum Erstellen einer Assembly mit den früheren Codedateien wird im Beispiel veranschaulicht, wie der Seite Vorgänge mit einem Feature für eine benutzerdefinierte Aktion ein Link hinzugefügt wird, sodass Administratoren auf den Dienst zugreifen können. Darüber hinaus wird beschrieben, wie mithilfe von benutzerdefinierten ASPX-Seiten die erforderliche Benutzeroberfläche zum Verwalten des Inhaltsdiensts und der zugehörigen Inhaltsspeicherorte bereitgestellt wird. Weitere Informationen zum Erstellen eines SharePoint Foundation-Projekts in Microsoft Visual Studio 2005 finden Sie unter Getting Started with Programmatically Customizing a SharePoint Web Site in Visual Studio.

ContentService-Klassendatei

Im folgenden Codebeispiel werden eine FormatType-Enumeration und die ContentService-Klasse der obersten Ebene definiert, die Konstruktoren und die folgenden Member enthält:

  • Local: Eine statische Eigenschaft zum Abrufen des aktuellen Inhaltsspeicherortdiensts.

  • Locations: Eine statische Eigenschaft, mit der auf die Auflistung von Inhaltsspeicherorten zugegriffen wird.

  • GetAllContentLocations: Eine Methode, von der alle durch den Dienst bereitgestellten Inhaltsspeicherorte zurückgegeben werden.

  • Format: Eine Eigenschaft, mit der der Formattyp für den Inhaltsdienst abgerufen oder festgelegt wird.

Fügen Sie am Anfang der anschließend angezeigten Codedateien eine Direktive zum Importieren des Microsoft.SharePoint.Administration-Namespaces hinzu, wie im folgenden Beispiel veranschaulicht. Legen Sie mithilfe des Persisted-Attributs fest, dass die Eigenschaftseinstellungen in der Datenbank beibehalten werden. Dem benutzerdefinierten Namespace, der im Beispiel Objekte enthält, ist der Name MS.Samples.SharePoint.ContentManager zugewiesen.

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; 
            }
        }
    }
}

Definieren Sie eine benutzerdefinierte Provision-Methode, um das ContentService-Objekt der Datenbank hinzuzufügen, wie im folgenden Beispiel veranschaulicht. Diese Methode kann in der vorherigen ContentService-Klasse enthalten sein oder separat aufgeführt werden, sodass sie modulbezogener ist und aus verschiedenen Kontexten aufgerufen werden kann, beispielsweise aus einem Befehlszeilenvorgang oder einem Feature-Installationsprogramm, das Sie zum Installieren des Diensts erstellen können. Die Provision-Methode fügt der Datenbank das ContentService-Objekt hinzu, ohne dass Sie die Assembly und die Klasse angeben müssen.

HinweisHinweis

Die von Ihnen festgelegte benutzerdefinierte Provision-Methode ist nicht mit der Provision-Methode der SPPersistedObject-Basisklasse identisch.

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();
    }
}

ContentLocationCollection-Klassendatei

Im folgenden Beispiel wird die ContentLocationCollection-Klasse definiert, die Konstruktoren und eine Add-Methode enthält, mit denen der Auflistung neue Inhaltsspeicherorte hinzugefügt werden.

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();
    }
}

ContentLocation-Klassendatei

Im folgenden Beispiel werden eine Enumeration (ContentLocationType), mit der der Typ des Inhaltsspeicherorts angegeben wird, sowie eine Klasse (ContentLocation) definiert, die die Eigenschaften für einen Inhaltsspeicherort festlegt. Zu diesen Eigenschaften zählen Anzeigename, Typ, URL und Ausgabepfad. Durch Angeben des Persisted-Attributs wird eine Eigenschaftseinstellung in der Datenbank beibehalten.

Die ContentLocation-Klasse enthält die folgenden Member:

  • DisplayName: Eigenschaft zum Abrufen des Anzeigenamens des Speicherorts.

  • Url: Eigenschaft zum Abrufen oder Festlegen der URL für einen Inhaltsspeicherort.

  • LocationType: Eigenschaft zum Abrufen oder Festlegen des Speicherorttyps.

  • ContentOutputPath: Eigenschaft zum Abrufen oder Festlegen eines Ausgabepfads.

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; }
    }
}

Hinzufügen einer benutzerdefinierten Aktion und von ASPX-Seiten

Fügen Sie dem Ordner \Admin ASPX-Seiten hinzu, und definieren Sie den zugehörigen CodeBehind in der Assembly. Weitere Informationen zu ASPX-Administratorseiten finden Sie unter Zentraladministrationsseiten. Fügen Sie einer Seite der Zentraladministration mit einem Feature eine benutzerdefinierte Aktion hinzu. Weitere Informationen zum Hinzufügen einer benutzerdefinierten Aktion finden Sie unter Vorgehensweise: Ändern der Benutzeroberfläche mit benutzerdefinierten Aktionen.

Mit der folgenden Datei Elements.xml wird der Seite Vorgänge, die mit der Seite contentman.aspx zum Verwalten von Inhaltsspeicherorten verknüpft ist, im Abschnitt Globale Konfiguration die benutzerdefinierte Aktion Inhaltsexport hinzugefügt.

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

Die Datei contentman.aspx, auf die die benutzerdefinierte Aktion zeigt, kann Links zu Formularseiten für das Erstellen, Anzeigen oder Bearbeiten von Inhaltsspeicherortelementen enthalten. CodeBehind für die Seite Neues Element kann eine Logik wie im folgenden Beispiel enthalten. Mit dieser werden Speicherortelemente für URLs hinzugefügt, die auf der Seite im Feld urlImportExport eingegeben werden. Außerdem erfolgt eine Umleitung zur Seite 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);
        }
    }
}

Nachdem Sie den benutzerdefinierten Dienst implementiert haben, können Sie auf seine Daten zugreifen, indem Sie den Dienst instanziieren und seine Member aufrufen. Sie können auch weitere benutzerdefinierte Objekte erstellen, die von anderen beibehaltenen Objekten im Microsoft.SharePoint.Administration-Namespace erben. Sie können beispielsweise eine von der SPJobDefinition-Klasse abgeleitete Klasse erstellen, um einen Zeitgeberauftrag zu implementieren und mit dem Dienst zeitlich gesteuerte Operationen auszuführen. Sie können auch von der SPFeatureReceiver-Klasse erben, um die Ereignisbehandlung zum Registrieren des Diensts zu definieren, wenn dieser als Feature installiert oder aktiviert wird.

Über beibehaltene Objekte können Sie der Datenbank benutzerdefinierte Administrationsobjekte hinzufügen, in denen die Logik und die Daten für eine auf der SharePoint Foundation-Plattform erstellte Webanwendung beibehalten wird.