IInstanceProvider Interface

Definitie

Declareert methoden die een serviceobject leveren of een serviceobject recyclen voor een WCF-service (Windows Communication Foundation).

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

Voorbeelden

In het volgende codevoorbeeld ziet u hoe u implementeert IInstanceProvider dat 'singleton'-gedrag biedt. Het retourneert altijd hetzelfde service-exemplaar en recyclet het niet.

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

In het volgende codevoorbeeld ziet u hoe u een aangepast kenmerk implementeert dat wordt geïmplementeerd IContractBehavior om de provider van het aangepaste service-exemplaar in te voegen. Het implementeert IContractBehaviorAttributeook , waarmee het gebruik wordt gebonden aan een specifiek contract.

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

Opmerkingen

Implementeer de IInstanceProvider interface om het maken en recyclen van serviceobjecten te beheren wanneer een InstanceContext object wordt aangevraagd of verwijderd.

Zodra de IInstanceProvider interface is geïmplementeerd, moet u uw aangepaste exemplaarproviderobject toewijzen aan de InstanceProvider eigenschap met behulp van een eindpuntgedrag (een IEndpointBehavior object) of een contractgedrag (een IContractBehavior object).

Als het invoegmechanisme een eindpuntgedrag is, kunt u ook een BehaviorExtensionElement object implementeren dat uw aangepaste gedrag kan invoegen met behulp van een configuratiebestand. Als het invoegmechanisme een contractgedrag is, kunt u het gedrag programmatisch invoegen voordat de servicehost wordt geopend of u kunt een aangepast kenmerk implementeren. (Zie de sectie Voorbeeld voor een voorbeeld van de benadering voor contractgedrag.)

IInstanceProvider heeft twee methoden: GetInstance en ReleaseInstance. Deze methoden worden doorgaans geïmplementeerd om serviceobjecten te maken met behulp van een niet-parameterloze constructor of om een bepaalde status te initialiseren of verwijderen die betrekking hebben op de levensduur van het object. Het groeperen van serviceobjecten is een voorbeeld van aangepaste IInstanceProvider functionaliteit.

Normaal gesproken roept de InstanceContext aanroep de GetInstance aan wanneer de InstanceContext eerste wordt gemaakt en roept de ReleaseInstance methode aan wanneer de InstanceContext methode wordt gesloten.

Er zijn twee manieren om ervoor te zorgen dat een InstanceContext object een serviceobject vrijgeeft voordat het InstanceContext object wordt gesloten. De eerste methode is het ReleaseInstanceMode instellen op AfterCall of BeforeAndAfterCall. De tweede methode is het aanroepen van de ReleaseServiceInstance methode. Als dit gebeurt, roept ReleaseInstance de InstanceContext methode aan op de instantieprovider van de dispatcher. Als er een nieuw bericht binnenkomt nadat het exemplaar is vrijgegeven, maakt WCF een nieuw exemplaar met behulp van de GetInstance methode.

Note

Als de InstanceContextMode service het geval is Single, roept het systeem de GetInstance of ReleaseInstance methoden niet aan, zelfs niet wanneer de gebruiker geen bekend serviceobject heeft opgegeven, tenzij de gebruiker rechtstreeks aanroept ReleaseServiceInstance en vervolgens aanroept GetServiceInstance.

Methoden

Name Description
GetInstance(InstanceContext, Message)

Retourneert een serviceobject op basis van het opgegeven InstanceContext object.

GetInstance(InstanceContext)

Retourneert een serviceobject op basis van het opgegeven InstanceContext object.

ReleaseInstance(InstanceContext, Object)

Aangeroepen wanneer een InstanceContext object een serviceobject recyclet.

Van toepassing op