다음을 통해 공유


IInstanceProvider 인터페이스

정의

서비스 개체를 제공하거나 WCF(Windows Communication Foundation) 서비스에 대한 서비스 개체를 재활용하는 메서드를 선언합니다.

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

예제

다음 코드 예제에서는 항상 동일한 서비스 인스턴스를 반환하고 이 인스턴스를 재활용하지 않는 "singleton" 동작을 제공하는 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에는 GetInstanceReleaseInstance의 두 메서드가 있습니다. 이러한 메서드는 일반적으로 매개 변수가 없는 생성자를 사용하여 서비스 개체를 만들거나 개체의 수명과 관련된 일부 상태를 초기화하거나 삭제하기 위해 구현됩니다. 서비스 개체 풀링은 사용자 지정 IInstanceProvider 기능의 한 예입니다.

일반적으로 InstanceContextGetInstance가 처음 생성될 때 InstanceContext를 호출하고 ReleaseInstance가 닫힐 때 InstanceContext 메서드를 호출합니다.

InstanceContext가 닫히기 전에 InstanceContext 개체가 서비스 개체를 해제하도록 하는 데는 두 가지 방법이 있습니다. 첫 번째 방법은 ReleaseInstanceModeAfterCall 또는 BeforeAndAfterCall로 설정하는 것이고, 두 번째 방법은 ReleaseServiceInstance 메서드를 호출하는 것입니다. 그런 다음 InstanceContext는 디스패처의 인스턴스 공급자에서 ReleaseInstance 메서드를 호출합니다. WCF를 사용 하 여 새 인스턴스를 만듭니다 인스턴스가 해제 된 이후에 새 메시지가 도착 하는 경우는 GetInstance 메서드.

참고

서비스의 InstanceContextModeSingle인 경우에는 사용자가 GetInstanceReleaseInstance를 직접 차례로 호출하지 않는 한, 사용자가 잘 알려진 서비스 개체를 제공하지 않았더라도 시스템에서 ReleaseServiceInstance 또는 GetServiceInstance 메서드를 호출하지 않습니다.

메서드

GetInstance(InstanceContext)

지정된 InstanceContext 개체에 부여된 서비스 개체를 반환합니다.

GetInstance(InstanceContext, Message)

지정된 InstanceContext 개체에 부여된 서비스 개체를 반환합니다.

ReleaseInstance(InstanceContext, Object)

InstanceContext 개체가 서비스 개체를 재활용할 때 호출됩니다.

적용 대상