IInstanceProvider Интерфейс

Определение

Объявляются методы, предоставляющие объект службы или перезапускающие объект службы для службы Windows Communication Foundation (WCF).Declares methods that provide a service object or recycle a service object for a Windows Communication Foundation (WCF) service.

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

Примеры

В следующем образце кода показано, как применять объект IInstanceProvider, который предоставляет «одноэлементное» поведение; он всегда возвращает одинаковый экземпляр службы и не перезапускает его.The following code example shows how to implement IInstanceProvider that provides "singleton" behavior; it always returns the same service instance and does not recycle it.

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 для вставки настраиваемого поставщика экземпляра службы.The following code example shows how to implement a custom attribute that implements IContractBehavior to insert the custom service instance provider. Он также реализует IContractBehaviorAttribute, который связывает его использование с конкретным контрактом.It also implements IContractBehaviorAttribute, which binds its use to a specific 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

Комментарии

Для управления созданием и перезапуском объектов служб применяется интерфейс IInstanceProvider, когда один из них запрашивается или освобождается объектом InstanceContext.Implement the IInstanceProvider interface to control the creation and recycling of service objects when one is requested or disposed by an InstanceContext object.

После реализации интерфейса IInstanceProvider необходимо сопоставить настраиваемому объекту экземпляра поставщика свойство InstanceProvider при помощи либо поведения конечной точки (объект IEndpointBehavior), либо поведения контракта (объект IContractBehavior).Once the IInstanceProvider interface is implemented, you must assign your custom instance provider object to the InstanceProvider property using either an endpoint behavior (a IEndpointBehavior object) or a contract behavior (a IContractBehavior object).

Если механизм вставки относится к поведению конечной точки, то также можно применить объект BehaviorExtensionElement, который может вставить ваше настраиваемое поведение при помощи файла конфигурации.If the insertion mechanism is an endpoint behavior you can also implement a BehaviorExtensionElement object that can insert your custom behavior using a configuration file. Если механизм вставки относится к поведению контракта, то поведение можно вставить программным путем до открытия узла службы или же можно применить настраиваемый атрибут.If the insertion mechanism is a contract behavior, you can insert the behavior programmatically prior to the opening of the service host or you can implement a custom attribute. (Пример подхода поведения контракта см. в разделе «Примеры»).(For an example of the contract behavior approach, see the Example section.)

Объект IInstanceProvider имеет два метода: GetInstance и ReleaseInstance.IInstanceProvider has two methods, GetInstance and ReleaseInstance. Эти методы обычно реализуются для создания объектов службы с помощью конструктора без параметров или для инициализации или удаления некоторого состояния, связанного со временем существования объекта.These methods are typically implemented to create service objects using a non-parameterless constructor or to initialize or dispose of some state related to the lifetime of the object. Группирование объектов служб является примером одной из функциональных возможностей объекта IInstanceProvider.Service object pooling is one example of custom IInstanceProvider functionality.

Обычно объект InstanceContext вызывает метод GetInstance, когда объект InstanceContext создается, и вызывает метод ReleaseInstance, когда объект InstanceContext закрывается.Typically, the InstanceContext invokes the GetInstance when the InstanceContext is first created and invokes the ReleaseInstance method when the InstanceContext is closed.

Существует два пути выпуска объектом InstanceContext объекта службы до закрытия объекта InstanceContext.There are two ways to cause an InstanceContext object to release a service object before the InstanceContext is closed. Первый метод заключается в задании у объекта ReleaseInstanceMode свойства AfterCall или BeforeAndAfterCall.The first method is to set the ReleaseInstanceMode to AfterCall or BeforeAndAfterCall. Второй метод заключается в вызове метода ReleaseServiceInstance.The second method is to call the ReleaseServiceInstance method. Если это выполняется, то объект InstanceContext вызывает метод ReleaseInstance в экземпляре поставщика диспетчера.If this is done, the InstanceContext calls the ReleaseInstance method on the dispatcher's instance provider. Если новое сообщение поступает после выпуска экземпляра, WCF создает новый экземпляр с помощью GetInstance метода.If a new message arrives after the instance has been released, WCF creates a new instance using the GetInstance method.

Примечание

Если свойство InstanceContextMode службы имеет значение Single, то система не вызывает метод GetInstance или ReleaseInstance даже когда пользователь не предоставляет хорошо известный объект служб, если только пользователь не вызывает непосредственно метод ReleaseServiceInstance, а затем метод GetServiceInstance.If the InstanceContextMode of the service is Single, the system does not call the GetInstance or ReleaseInstance methods even when the user did not provide a well-known service object unless the user directly calls ReleaseServiceInstance and then calls GetServiceInstance.

Методы

GetInstance(InstanceContext)

Возвращает объект службы, которому дан указанный объект InstanceContext.Returns a service object given the specified InstanceContext object.

GetInstance(InstanceContext, Message)

Возвращает объект службы, которому дан указанный объект InstanceContext.Returns a service object given the specified InstanceContext object.

ReleaseInstance(InstanceContext, Object)

Вызывается, когда объект InstanceContext перезапускает объект службы.Called when an InstanceContext object recycles a service object.

Применяется к