IInstanceProvider Interface
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Declareert methoden die een serviceobject leveren of een serviceobject recyclen voor een WCF-service (Windows Communication Foundation).
public interface class IInstanceProvider
public interface IInstanceProvider
type IInstanceProvider = interface
Public Interface IInstanceProvider
Voorbeelden
In het volgende codevoorbeeld ziet u hoe u implementeert IInstanceProvider dat 'singleton'-gedrag biedt. Het retourneert altijd hetzelfde service-exemplaar en recyclet het niet.
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
In het volgende codevoorbeeld ziet u hoe u een aangepast kenmerk implementeert dat wordt geïmplementeerd IContractBehavior om de provider van het aangepaste service-exemplaar in te voegen. Het implementeert IContractBehaviorAttributeook , waarmee het gebruik wordt gebonden aan een specifiek 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
Opmerkingen
Implementeer de IInstanceProvider interface om het maken en recyclen van serviceobjecten te beheren wanneer een InstanceContext object wordt aangevraagd of verwijderd.
Zodra de IInstanceProvider interface is geïmplementeerd, moet u uw aangepaste exemplaarproviderobject toewijzen aan de InstanceProvider eigenschap met behulp van een eindpuntgedrag (een IEndpointBehavior object) of een contractgedrag (een IContractBehavior object).
Als het invoegmechanisme een eindpuntgedrag is, kunt u ook een BehaviorExtensionElement object implementeren dat uw aangepaste gedrag kan invoegen met behulp van een configuratiebestand. Als het invoegmechanisme een contractgedrag is, kunt u het gedrag programmatisch invoegen voordat de servicehost wordt geopend of u kunt een aangepast kenmerk implementeren. (Zie de sectie Voorbeeld voor een voorbeeld van de benadering voor contractgedrag.)
IInstanceProvider heeft twee methoden: GetInstance en ReleaseInstance. Deze methoden worden doorgaans geïmplementeerd om serviceobjecten te maken met behulp van een niet-parameterloze constructor of om een bepaalde status te initialiseren of verwijderen die betrekking hebben op de levensduur van het object. Het groeperen van serviceobjecten is een voorbeeld van aangepaste IInstanceProvider functionaliteit.
Normaal gesproken roept de InstanceContext aanroep de GetInstance aan wanneer de InstanceContext eerste wordt gemaakt en roept de ReleaseInstance methode aan wanneer de InstanceContext methode wordt gesloten.
Er zijn twee manieren om ervoor te zorgen dat een InstanceContext object een serviceobject vrijgeeft voordat het InstanceContext object wordt gesloten. De eerste methode is het ReleaseInstanceMode instellen op AfterCall of BeforeAndAfterCall. De tweede methode is het aanroepen van de ReleaseServiceInstance methode. Als dit gebeurt, roept ReleaseInstance de InstanceContext methode aan op de instantieprovider van de dispatcher. Als er een nieuw bericht binnenkomt nadat het exemplaar is vrijgegeven, maakt WCF een nieuw exemplaar met behulp van de GetInstance methode.
Note
Als de InstanceContextMode service het geval is Single, roept het systeem de GetInstance of ReleaseInstance methoden niet aan, zelfs niet wanneer de gebruiker geen bekend serviceobject heeft opgegeven, tenzij de gebruiker rechtstreeks aanroept ReleaseServiceInstance en vervolgens aanroept GetServiceInstance.
Methoden
| Name | Description |
|---|---|
| GetInstance(InstanceContext, Message) |
Retourneert een serviceobject op basis van het opgegeven InstanceContext object. |
| GetInstance(InstanceContext) |
Retourneert een serviceobject op basis van het opgegeven InstanceContext object. |
| ReleaseInstance(InstanceContext, Object) |
Aangeroepen wanneer een InstanceContext object een serviceobject recyclet. |