Share via


Tutorial: creación de un objeto del servicio de contenido

Última modificación: miércoles, 30 de septiembre de 2009

Hace referencia a: SharePoint Foundation 2010

En este artículo
Archivo de la clase ContentService
Archivo de la clase ContentLocationCollection
Archivo de la clase ContentLocation
Adición de una acción personalizada y páginas ASPX

Este tutorial explora el procedimiento para definir la lógica de un servicio personalizado para administrar el contenido del sitio en una implementación de SharePoint Foundation. En el ejemplo se muestra cómo crear clases derivadas de clases del espacio de nombres Microsoft.SharePoint.Administration para almacenar de forma persistente la configuración administrativa personalizada en la base de datos. El ejemplo incluye archivos de clases que implementan estructuras de datos que contienen metadatos acerca de una lista de ubicaciones. Cada ubicación de contenido especifica una dirección URL que debe conservarse.

En el ejemplo se incluye la creación de archivos de código para las siguientes clases:

  • ContentService   Define el objeto de nivel superior, que se deriva de la clase SPService y proporciona la lógica para administrar las ubicaciones de contenido en una implementación. Esta clase incluye constructores para inicializar el objeto ContentService, así como miembros para recuperar el servicio de contenido y su colección de ubicaciones de contenido.

  • ContentLocationCollection   Define una clase de colección que se hereda de la clase SPPerisistedChildCollection y proporciona un objeto para contener ubicaciones de contenido. Esta clase contiene un constructor y un método Add.

  • ContentLocation   Se hereda de SPPersistedObject y define una ubicación de contenido. Esta clase incluye los constructores y los miembros de la configuración de propiedades personalizadas.

Además de crear un ensamblado con los archivos de código anteriores, en el ejemplo se muestra cómo usar una característica de acción personalizada para agregar un vínculo en la página Operaciones para que los administradores puedan tener acceso al servicio. El ejemplo también describe cómo usar las páginas .aspx personalizadas para proporcionar la interfaz de usuario necesaria para administrar el servicio de contenido y sus elementos de ubicación de contenido. Para obtener información acerca de cómo crear un proyecto de SharePoint Foundation en Microsoft Visual Studio 2005, consulte Introducción a la personalización mediante programación de un sitio web de SharePoint en Visual Studio.

Archivo de la clase ContentService

En el ejemplo de código siguiente se define una enumeración FormatType y la clase ContentService de nivel superior, que incluye los constructores y los miembros siguientes:

  • Local   Propiedad estática para recuperar el servicio de ubicación de contenido actual.

  • Locations   Propiedad estática para tener acceso a la colección de ubicaciones de contenido.

  • GetAllContentLocations   Método para devolver todas las ubicaciones de contenido proporcionadas a través del servicio.

  • Format   Propiedad para obtener o establecer el tipo de formato del servicio de contenido.

En la parte superior de cada archivo de código que se presenta posteriormente, agregue una directiva para importar el espacio de nombres Microsoft.SharePoint.Administration, como en el ejemplo siguiente. Use el atributo Persisted para hacer que la configuración de la propiedad sea persistente en la base de datos. El espacio de nombres personalizado que contiene objetos en el ejemplo se denomina 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; 
            }
        }
    }
}

Defina un método Provision personalizado para agregar el objeto ContentService a la base de datos, como en el ejemplo siguiente. Este método puede estar incluido en la clase ContentService anterior, o bien estar incluido por separado para ser más modular y permitir que diferentes contextos lo puedan llamar (como desde un instalador de características que se puede crear para instalar el servicio o desde una operación de la línea de comandos). El método Provision agrega el objeto ContentService a la base de datos sin que sea necesario especificar el ensamblado y la clase.

Nota

El método Provision personalizado que se define no es el método Provision de la clase SPPersistedObject 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();
    }
}

Archivo de la clase ContentLocationCollection

En el ejemplo siguiente se define la clase ContentLocationCollection, que incluye los constructores y un método Add para agregar nuevas ubicaciones de contenido a la colección.

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

Archivo de la clase ContentLocation

En el siguiente ejemplo se define una enumeración, ContentLocationType, que especifica el tipo de ubicación de contenido y una clase, ContentLocation, que define las propiedades de una ubicación de contenido, incluido su nombre para mostrar, tipo, dirección URL y ruta de acceso de salida. Al especificar el atributo Persisted, se almacena de forma persistente la configuración de la propiedad en la base de datos.

La clase ContentLocation incluye los siguientes miembros:

  • DisplayName   Propiedad para obtener el nombre para mostrar de la ubicación.

  • Url   Propiedad para obtener o establecer la dirección URL de una ubicación de contenido.

  • LocationType   Propiedad para obtener o establecer el tipo de ubicación.

  • ContentOutputPath   Propiedad para obtener o establecer una ruta de acceso de salida.

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

Adición de una acción personalizada y páginas ASPX

Agregue páginas .aspx a la carpeta \Admin y defina su código subyacente en el ensamblado. Para obtener información acerca de las páginas .aspx administrativas, consulte Páginas de Administración central. Use una característica para agregar una acción personalizada a una página de Administración central. Para obtener información acerca de cómo agregar una acción personalizada, consulte Procedimiento para modificar la interfaz de usuario con acciones personalizadas.

El siguiente archivo Elements.xml agrega una acción personalizada de exportación de contenido (Content export) a la sección Configuración global de la página Operaciones que se vincula con una página contentman.aspx para la administración de ubicaciones de contenido.

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

El archivo contentman.aspx al que hace referencia la acción personalizada puede incluir vínculos a páginas de formulario para crear, mostrar o editar elementos de ubicación de contenido. El código subyacente para la página Nuevo elemento, por ejemplo, puede incluir lógica como la siguiente, que agrega elementos de ubicación para las direcciones URL que se especifican en un cuadro urlImportExport en la página, y que redirige a la página 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);
        }
    }
}

Después de implementar el servicio personalizado, puede tener acceso a sus datos mediante la creación de instancias del servicio y la realización de llamadas a sus miembros. También puede crear otros objetos personalizados que se hereden de otros objetos almacenados de forma persistente en el espacio de nombres Microsoft.SharePoint.Administration. Puede crear una clase, por ejemplo, que se derive de la clase SPJobDefinition para implementar un trabajo del temporizador y realizar operaciones temporizadas a través del servicio personalizado. Como alternativa, puede heredar de la clase SPFeatureReceiver para definir el control de eventos para registrar el servicio cuando se instale o active como una característica.

Mediante objetos persistentes, puede agregar objetos de administración personalizados a la base de datos de configuración para almacenar de forma persistente la lógica y los datos para una aplicación web que se basa en la plataforma SharePoint Foundation.