Freigeben über


IInstanceProvider Schnittstelle

Definition

Deklariert Methoden, die ein Dienstobjekt bereitstellen oder ein Dienstobjekt für einen WCF-Dienst (Windows Communication Foundation) wiederverwenden.

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

Beispiele

Das folgende Codebeispiel zeigt, wie IInstanceProvider mit "Singleton"-Verhalten implementiert wird: Es wird immer die gleiche Dienstinstanz zurückgegeben, und diese wird nicht wiederverwendet.

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

Das folgende Codebeispiel zeigt, wie ein benutzerdefiniertes Attribut implementiert wird, das IContractBehavior zum Einfügen des benutzerdefinierten Dienstinstanzanbieters implementiert. Es implementiert auch IContractBehaviorAttribute, wodurch die Verwendung an einen bestimmten Vertrag gebunden wird.

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

Hinweise

Implementieren Sie die IInstanceProvider-Schnittstelle, um die Erstellung und Wiederverwendung von Dienstobjekten zu steuern, die von einem InstanceContext-Objekt angefordert oder freigegeben werden.

Nachdem Sie die IInstanceProvider-Schnittstelle implementiert haben, müssen Sie das benutzerdefinierte Instanzanbieterobjekt der InstanceProvider-Schnittstelle zuordnen, indem Sie entweder ein Endpunktverhalten (ein IEndpointBehavior-Objekt) oder ein Vertragsverhalten (ein IContractBehavior-Objekt) verwenden.

Wenn Sie als Einfügemechanismus ein Endpunktverhalten verwenden, können Sie auch ein BehaviorExtensionElement-Objekt implementieren, das Ihr benutzerdefiniertes Verhalten mithilfe einer Konfigurationsdatei einfügt. Wenn Sie ein Vertragsverhalten verwenden, können Sie das Verhalten vor dem Öffnen des Diensthosts programmgesteuert einfügen oder ein benutzerdefiniertes Attribut implementieren. (Ein Beispiel für den Vertragsverhaltensansatz finden Sie im Abschnitt "Beispiel".)

IInstanceProvider verfügt über zwei Methoden, GetInstance und ReleaseInstance. Diese Methoden werden in der Regel implementiert, um Dienstobjekte mithilfe eines nicht parameterlosen Konstruktors zu erstellen oder einen Zustand im Zusammenhang mit der Lebensdauer des Objekts zu initialisieren oder zu entsorgen. Ein Beispiel für die Funktionalität des benutzerdefinierten IInstanceProvider ist das Dienstobjektpooling.

Normalerweise ruft der InstanceContext den GetInstance auf, wenn der InstanceContext erstellt wird, und ruft die ReleaseInstance-Methode auf, wenn der InstanceContext geschlossen wird.

Es gibt zwei Möglichkeiten, zu veranlassen, dass ein InstanceContext-Objekt ein Dienstobjekt freigibt, bevor der InstanceContext geschlossen wird. Die erste Möglichkeit besteht darin, ReleaseInstanceMode auf AfterCall oder BeforeAndAfterCall zu setzen. Die zweite Möglichkeit besteht darin, die ReleaseServiceInstance-Methode aufzurufen. In diesem Fall ruft der InstanceContext die Methode ReleaseInstance auf dem Instanzanbieter des Verteilers auf. Wenn eine neue Nachricht nach der Freigabe der Instanz eingetroffen ist, erstellt WCF eine neue Instanz mithilfe der GetInstance Methode.

Hinweis

Wenn der InstanceContextMode des Dienstes Single ist, ruft das System weder die GetInstance-Methode noch die ReleaseInstance-Methode auf, auch wenn kein bekanntes Dienstobjekt vom Benutzer bereitgestellt wurde, es sei denn, der Benutzer ruft ReleaseServiceInstance direkt und dann GetServiceInstance auf.

Methoden

GetInstance(InstanceContext)

Gibt ein Dienstobjekt unter Berücksichtigung des angegebenen InstanceContext-Objekts zurück.

GetInstance(InstanceContext, Message)

Gibt ein Dienstobjekt unter Berücksichtigung des angegebenen InstanceContext-Objekts zurück.

ReleaseInstance(InstanceContext, Object)

Wird aufgerufen, wenn ein InstanceContext-Objekt ein Dienstobjekt wiederverwendet.

Gilt für