IInstanceProvider Interface

Definição

Declara métodos que fornecem um objeto de serviço ou reciclam um objeto de serviço para um serviço da Windows Communication Foundation (WCF).

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

Exemplos

O exemplo de código seguinte mostra como implementar IInstanceProvider esse comportamento de "singleton"; devolve sempre a mesma instância de serviço e não a 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

O exemplo de código seguinte mostra como implementar um atributo personalizado que implementa IContractBehavior a inserção do fornecedor de instância de serviço personalizado. Também implementa IContractBehaviorAttribute, que vincula a sua utilização a um 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

Observações

Implemente a IInstanceProvider interface para controlar a criação e reciclagem de objetos de serviço quando um deles é solicitado ou descartado por um InstanceContext objeto.

Uma vez implementada a IInstanceProvider interface, deve atribuir o seu objeto provedor de instância personalizado à InstanceProvider propriedade usando um comportamento de endpoint (um IEndpointBehavior objeto) ou um comportamento de contrato (um IContractBehavior objeto).

Se o mecanismo de inserção for um comportamento de endpoint, também podes implementar um BehaviorExtensionElement objeto que possa inserir o teu comportamento personalizado usando um ficheiro de configuração. Se o mecanismo de inserção for um comportamento de contrato, pode inserir o comportamento programaticamente antes da abertura do host de serviço ou pode implementar um atributo personalizado. (Para um exemplo da abordagem do comportamento contratual, veja a secção Exemplo.)

IInstanceProvider tem dois métodos, GetInstance e ReleaseInstance. Estes métodos são tipicamente implementados para criar objetos de serviço usando um construtor não sem parâmetros ou para inicializar ou eliminar algum estado relacionado com a vida útil do objeto. O pooling de objetos de serviço é um exemplo de funcionalidade personalizada IInstanceProvider .

Normalmente, o InstanceContext invoca quando GetInstance o InstanceContext é criado pela primeira vez e invoca o ReleaseInstance método quando o InstanceContext está fechado.

Existem duas formas de fazer com que um InstanceContext objeto liberte um objeto de serviço antes de ser InstanceContext fechado. O primeiro método é definir o ReleaseInstanceMode para AfterCall ou BeforeAndAfterCall. O segundo método é chamar o ReleaseServiceInstance método. Se isto for feito, chama InstanceContext o ReleaseInstance método para o fornecedor de instâncias do despachante. Se uma nova mensagem chegar após a instância ter sido libertada, o WCF cria uma nova instância usando o GetInstance método.

Note

Se o InstanceContextMode do serviço for Single, o sistema não chama os GetInstance métodos ou ReleaseInstance mesmo quando o utilizador não forneceu um objeto de serviço bem conhecido, a menos que o utilizador chame ReleaseServiceInstance diretamente e depois chame GetServiceInstance.

Métodos

Name Description
GetInstance(InstanceContext, Message)

Devolve um objeto de serviço dado o objeto especificado InstanceContext .

GetInstance(InstanceContext)

Devolve um objeto de serviço dado o objeto especificado InstanceContext .

ReleaseInstance(InstanceContext, Object)

Chamado quando um InstanceContext objeto recicla um objeto de serviço.

Aplica-se a