Compartir a través de


IInstanceProvider Interfaz

Definición

Declara métodos que proporcionan un objeto de servicio o reciclan un objeto de servicio de un servicio Windows Communication Foundation (WCF).

public interface class IInstanceProvider
public interface IInstanceProvider
type IInstanceProvider = interface
Public Interface IInstanceProvider

Ejemplos

El ejemplo de código siguiente muestra como implementar IInstanceProvider, que proporciona un comportamiento "singleton"; siempre devuelve la misma instancia del servicio y no la recicla.

public class ObjectProviderBehavior : IInstanceProvider
{

  string message;
  SampleService service = null;

  public ObjectProviderBehavior(string msg)
  {
    Console.WriteLine("The non-default constructor has been called.");
    this.message = msg;
    this.service = new SampleService("Singleton sample service.");
  }

  #region IInstanceProvider Members

  public object GetInstance(InstanceContext instanceContext, System.ServiceModel.Channels.Message message)
  {
    Console.WriteLine("GetInstance is called:");
    return this.service;
  }

  public object GetInstance(InstanceContext instanceContext)
  {
    Console.WriteLine("GetInstance is called:");
    return this.service;
  }

  public void ReleaseInstance(InstanceContext instanceContext, object instance)
  {
    Console.WriteLine("ReleaseInstance is called. The SingletonBehaviorAttribute never releases.");
  }

  #endregion
}
Public Class ObjectProviderBehavior
    Implements IInstanceProvider

  Private message As String
  Private service As SampleService = Nothing

  Public Sub New(ByVal msg As String)
    Console.WriteLine("The non-default constructor has been called.")
    Me.message = msg
    Me.service = New SampleService("Singleton sample service.")
  End Sub

  #Region "IInstanceProvider Members"

  Public Function GetInstance(ByVal instanceContext As InstanceContext, ByVal message As System.ServiceModel.Channels.Message) As Object Implements IInstanceProvider.GetInstance
    Console.WriteLine("GetInstance is called:")
    Return Me.service
  End Function

  Public Function GetInstance(ByVal instanceContext As InstanceContext) As Object Implements IInstanceProvider.GetInstance
    Console.WriteLine("GetInstance is called:")
    Return Me.service
  End Function

  Public Sub ReleaseInstance(ByVal instanceContext As InstanceContext, ByVal instance As Object) Implements IInstanceProvider.ReleaseInstance
    Console.WriteLine("ReleaseInstance is called. The SingletonBehaviorAttribute never releases.")
  End Sub

  #End Region
End Class

El ejemplo de código siguiente muestra cómo implementar un atributo personalizado que implementa IContractBehavior para insertar el proveedor de instancias del servicio personalizado. También implementa IContractBehaviorAttribute, que enlaza su uso a un contrato específico.

public class SingletonBehaviorAttribute : Attribute, IContractBehaviorAttribute, IContractBehavior
{

  #region IContractBehaviorAttribute Members

  public Type TargetContract
  {
    get { return typeof(ISampleService); }
  }

  #endregion

  #region IContractBehavior Members

  public void AddBindingParameters(ContractDescription description, ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection parameters)
  {
    return;
  }

  public void ApplyClientBehavior(ContractDescription description, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
  {
    return;
  }

  public void ApplyDispatchBehavior(ContractDescription description, ServiceEndpoint endpoint, DispatchRuntime dispatch)
  {
    dispatch.InstanceProvider = new ObjectProviderBehavior("Custom ObjectProviderBehavior constructor.");
  }

  public void Validate(ContractDescription description, ServiceEndpoint endpoint)
  {
    return;
  }

  #endregion
}
Public Class SingletonBehaviorAttribute
    Inherits Attribute
    Implements IContractBehaviorAttribute, IContractBehavior

  #Region "IContractBehaviorAttribute Members"

  Public ReadOnly Property TargetContract() As Type Implements IContractBehaviorAttribute.TargetContract
    Get
        Return GetType(ISampleService)
    End Get
  End Property

  #End Region

  #Region "IContractBehavior Members"

  Public Sub AddBindingParameters(ByVal description As ContractDescription, ByVal endpoint As ServiceEndpoint, ByVal parameters As System.ServiceModel.Channels.BindingParameterCollection) Implements IContractBehavior.AddBindingParameters
    Return
  End Sub

  Public Sub ApplyClientBehavior(ByVal description As ContractDescription, ByVal endpoint As ServiceEndpoint, ByVal clientRuntime As ClientRuntime) Implements IContractBehavior.ApplyClientBehavior
    Return
  End Sub

  Public Sub ApplyDispatchBehavior(ByVal description As ContractDescription, ByVal endpoint As ServiceEndpoint, ByVal dispatch As DispatchRuntime) Implements IContractBehavior.ApplyDispatchBehavior
    dispatch.InstanceProvider = New ObjectProviderBehavior("Custom ObjectProviderBehavior constructor.")
  End Sub

  Public Sub Validate(ByVal description As ContractDescription, ByVal endpoint As ServiceEndpoint) Implements IContractBehavior.Validate
    Return
  End Sub

  #End Region
End Class

Comentarios

Implemente la interfaz IInstanceProvider para controlar la creación y el reciclaje de los objetos de servicio cuando un objeto InstanceContext solicita o elimina uno.

Una vez implementada la interfaz IInstanceProvider, debe asignar su objeto de proveedor de instancias personalizado a la propiedad InstanceProvider utilizando un comportamiento del extremo (un objeto IEndpointBehavior) o un comportamiento del contrato (un objeto IContractBehavior ).

Si el mecanismo de inserción es un comportamiento del extremo también puede implementar un objeto BehaviorExtensionElement que pueda insertar su comportamiento personalizado mediante un archivo de configuración. Si el mecanismo de inserción es un comportamiento del contrato, puede insertar mediante programación el comportamiento antes de la apertura del host del servicio o puede implementar un atributo personalizado. (Para obtener un ejemplo de comportamiento de contrato, consulte la sección Ejemplo.)

IInstanceProvider tiene dos métodos: GetInstance y ReleaseInstance. Normalmente, estos métodos se implementan para crear objetos de servicio mediante un constructor sin parámetros o para inicializar o eliminar algún estado relacionado con la duración del objeto. La agrupación de objetos de servicio es un ejemplo de funcionalidad IInstanceProvider personalizada.

Normalmente, InstanceContext invoca GetInstance cuando InstanceContext se crea por primera vez e invoca el método ReleaseInstance cuando se cierra InstanceContext.

Hay dos maneras de hacer que un objeto InstanceContext libere un objeto de servicio antes de que se cierre InstanceContext. El primer método es establecer ReleaseInstanceMode en AfterCall o BeforeAndAfterCall. El segundo método es llamar al método ReleaseServiceInstance. Si se hace esto, InstanceContext llama al método ReleaseInstance en el proveedor de instancias del distribuidor. Si llega un nuevo mensaje después de que se haya liberado la instancia, WCF crea una nueva instancia mediante el GetInstance método .

Nota

Si InstanceContextMode del servicio es Single, el sistema no llama a los métodos GetInstance o ReleaseInstance ni siquiera cuando el usuario no proporcionó un objeto de servicio conocido a menos que el usuario llame directamente a ReleaseServiceInstance y a continuación a GetServiceInstance.

Métodos

GetInstance(InstanceContext)

Devuelve un objeto de servicio dado el objeto InstanceContext especificado.

GetInstance(InstanceContext, Message)

Devuelve un objeto de servicio dado el objeto InstanceContext especificado.

ReleaseInstance(InstanceContext, Object)

Llamado cuando un objeto InstanceContext recicla un objeto de servicio.

Se aplica a