Compartilhar via


IInstanceProvider Interface

Definição

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

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

Exemplos

O exemplo de código a seguir mostra como implementar IInstanceProvider o comportamento "singleton"; ele sempre retorna 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 a seguir mostra como implementar um atributo personalizado que implementa para inserir o provedor de instância de IContractBehavior serviço personalizado. Ele também implementa IContractBehaviorAttribute, o que associa seu uso 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

Comentários

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

Depois que a IInstanceProvider interface for implementada, você deverá atribuir seu InstanceProvider objeto de provedor de instância personalizado à propriedade usando um comportamento de ponto de extremidade (um IEndpointBehavior objeto) ou um comportamento de contrato (um IContractBehavior objeto).

Se o mecanismo de inserção for um comportamento de ponto de extremidade, você também poderá implementar um BehaviorExtensionElement objeto que pode inserir seu comportamento personalizado usando um arquivo de configuração. Se o mecanismo de inserção for um comportamento de contrato, você poderá inserir o comportamento programaticamente antes da abertura do host de serviço ou implementar um atributo personalizado. (Para obter um exemplo da abordagem de comportamento do contrato, consulte a seção Exemplo.)

IInstanceProvider possui dois métodos, GetInstance e ReleaseInstance. Normalmente, esses métodos são implementados para criar objetos de serviço usando um construtor sem parâmetros ou para inicializar ou descartar algum estado relacionado ao tempo de vida do objeto. O pool de objetos de serviço é um exemplo de funcionalidade personalizada IInstanceProvider .

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

Há duas maneiras de fazer com que um InstanceContext objeto libere um objeto de serviço antes de ser InstanceContext fechado. O primeiro método é definir como ReleaseInstanceMode AfterCall ou BeforeAndAfterCall. O segundo método é chamar o ReleaseServiceInstance método. Se isso for feito, o InstanceContext método será chamado ReleaseInstance no provedor de instância do dispatcher. Se uma nova mensagem chegar depois que a instância for liberada, o WCF criará uma nova instância usando o GetInstance método.

Observação

Se o InstanceContextMode serviço forSingle, o sistema não chamará os métodos ou ReleaseInstance os GetInstance métodos mesmo quando o usuário não forneceu um objeto de serviço conhecido, a menos que o usuário ligue ReleaseServiceInstance diretamente e ligueGetServiceInstance.

Métodos

GetInstance(InstanceContext)

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

GetInstance(InstanceContext, Message)

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

ReleaseInstance(InstanceContext, Object)

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

Aplica-se a