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.