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 имеет два метода: GetInstance и ReleaseInstance. Эти методы обычно реализуются для создания объектов службы с помощью конструктора без параметров или инициализации или удаления некоторого состояния, связанного со временем существования объекта. Группирование объектов служб является примером одной из функциональных возможностей объекта IInstanceProvider.
Обычно объект InstanceContext вызывает метод GetInstance, когда объект InstanceContext создается, и вызывает метод ReleaseInstance, когда объект InstanceContext закрывается.
Существует два пути выпуска объектом InstanceContext объекта службы до закрытия объекта InstanceContext. Первый метод заключается в задании у объекта ReleaseInstanceMode свойства AfterCall или BeforeAndAfterCall. Второй метод заключается в вызове метода ReleaseServiceInstance. Если это выполняется, то объект InstanceContext вызывает метод ReleaseInstance в экземпляре поставщика диспетчера. Если новое сообщение поступает после выпуска экземпляра, WCF создает новый экземпляр с помощью GetInstance метода.
Примечание
Если свойство InstanceContextMode службы имеет значение Single, то система не вызывает метод GetInstance или ReleaseInstance даже когда пользователь не предоставляет хорошо известный объект служб, если только пользователь не вызывает непосредственно метод ReleaseServiceInstance, а затем метод GetServiceInstance.
Методы
GetInstance(InstanceContext) |
Возвращает объект службы, которому дан указанный объект InstanceContext. |
GetInstance(InstanceContext, Message) |
Возвращает объект службы, которому дан указанный объект InstanceContext. |
ReleaseInstance(InstanceContext, Object) |
Вызывается, когда объект InstanceContext перезапускает объект службы. |