次の方法で共有


IInstanceProvider インターフェイス

定義

Windows Communication Foundation (WCF) サービスのサービス オブジェクトを提供またはリサイクルするメソッドを宣言します。

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

次のコード例は、"シングルトン"動作を実現する IInstanceProvider の実装方法を示しています。このインスタンス プロバイダーは常に同じサービス インスタンスを返し、インスタンスを再利用しません。

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

次のコード例は、IContractBehavior を実装してカスタムのサービス インスタンス プロバイダーを挿入するカスタム属性の実装方法を示しています。 このコードでは、このカスタム属性の用途を特定のコントラクトに結び付ける IContractBehaviorAttribute も実装しています。

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

注釈

IInstanceProvider オブジェクトによってサービス オブジェクトが要求または破棄されたときに、サービス オブジェクトの作成およびリサイクルを制御するための InstanceContext インターフェイスを実装します。

IInstanceProvider インターフェイスを実装した後は、エンドポイントの動作 (InstanceProvider オブジェクト) またはコントラクトの動作 (IEndpointBehavior オブジェクト) を使用して、カスタム インターフェイス プロバイダー オブジェクトを IContractBehavior プロパティに割り当てる必要があります。

挿入メカニズムがエンドポイント動作の場合は、構成ファイルを使用してカスタム動作を挿入できる BehaviorExtensionElement オブジェクトも実装できます。 挿入メカニズムがコントラクト動作の場合は、サービス ホストを開く前にプログラムで動作を挿入したり、カスタム属性を実装したりできます。 コントラクト動作の例については、「使用例」のセクションを参照してください。

IInstanceProvider には、2 つのメソッド GetInstanceReleaseInstance があります。 通常、これらのメソッドは、パラメーターなしのコンストラクターを使用してサービス オブジェクトを作成したり、オブジェクトの有効期間に関連する状態を初期化または破棄したりするために実装されます。 サービス オブジェクト プールは、IInstanceProvider のカスタム機能の一例です。

通常、InstanceContext は、GetInstance が最初に作成された時点で InstanceContext を呼び出し、ReleaseInstance が閉じられると、InstanceContext メソッドを呼び出します。

InstanceContext が閉じられる前に InstanceContext オブジェクトにサービス オブジェクトを解放させるには、2 つの方法があります。 第 1 の方法は、ReleaseInstanceModeAfterCall または BeforeAndAfterCall に設定することです。 第 2 の方法は、ReleaseServiceInstance メソッドを呼び出すことです。 この方法を使用すると、InstanceContext は、ディスパッチャーのインスタンス プロバイダーで ReleaseInstance メソッドを呼び出します。 インスタンスが解放された後に新しいメッセージが到着した場合、WCF はメソッドを使用して新しいインスタンスを GetInstance 作成します。

注意

サービスの InstanceContextModeSingle の場合は、ユーザーが既知のサービス オブジェクトを提供しなかったときでも、システムは GetInstance メソッドと ReleaseInstance メソッドのいずれも呼び出しません。ただし、ユーザーが直接 ReleaseServiceInstance を呼び出してから、GetServiceInstance を呼び出す場合を除きます。

メソッド

GetInstance(InstanceContext)

指定した InstanceContext オブジェクトのサービス オブジェクトを返します。

GetInstance(InstanceContext, Message)

指定した InstanceContext オブジェクトのサービス オブジェクトを返します。

ReleaseInstance(InstanceContext, Object)

InstanceContext オブジェクトがサービス オブジェクトをリサイクルするときに呼び出されます。

適用対象