IInstanceProvider Interface
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Déclare des méthodes qui fournissent un objet de service ou recyclent un objet de service pour un service Windows Communication Foundation (WCF).
public interface class IInstanceProvider
public interface IInstanceProvider
type IInstanceProvider = interface
Public Interface IInstanceProvider
Exemples
L'exemple de code suivant indique comment implémenter IInstanceProvider pour fournir un comportement singleton ; il retourne toujours la même instance de service et ne la recycle pas.
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
L'exemple de code suivant indique comment implémenter un attribut personnalisé qui implémente IContractBehavior pour insérer le fournisseur d'instances de service personnalisé. Il implémente également IContractBehaviorAttribute, qui lie son utilisation à un contrat spécifique.
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
Remarques
Implémentez l'interface IInstanceProvider pour contrôler la création et le recyclage d'objets de service en cas de demande ou d'élimination par un objet InstanceContext.
Une fois l'interface IInstanceProvider implémentée, vous devez assigner votre objet de fournisseur d'instances personnalisé à la propriété InstanceProvider à l'aide d'un comportement de point de terminaison (objet IEndpointBehavior) ou d'un comportement de contrat (objet IContractBehavior).
Si le mécanisme d'insertion est un comportement de point de terminaison, vous pouvez également implémenter un objet BehaviorExtensionElement qui peut insérer votre comportement personnalisé à l'aide d'un fichier de configuration. Si le mécanisme d'insertion est un comportement de contrat, vous pouvez insérer le comportement par programme avant l'ouverture de l'hôte de service ou vous pouvez implémenter un attribut personnalisé. Pour retrouver un exemple d'approche de comportement de contrat, reportez-vous à la section Exemple.
IInstanceProvider a deux méthodes : GetInstance et ReleaseInstance. Ces méthodes sont généralement implémentées pour créer des objets de service à l’aide d’un constructeur sans paramètre ou pour initialiser ou supprimer un état lié à la durée de vie de l’objet. La mise en mise en pool d’objets de service est un exemple de fonctionnalité IInstanceProvider personnalisée.
En règle générale, InstanceContext appelle GetInstance lors de la création de InstanceContext et appelle la méthode ReleaseInstance à la fermeture de InstanceContext.
Deux méthodes différentes permettent à un objet InstanceContext de libérer un objet de service avant la fermeture de InstanceContext. La première méthode consiste à assigner ReleaseInstanceMode à AfterCall ou à BeforeAndAfterCall. La seconde méthode consiste à appeler la méthode ReleaseServiceInstance. Dans ce cas, InstanceContext appelle la méthode ReleaseInstance sur le fournisseur d'instances du répartiteur. Si un nouveau message arrive une fois l’instance libérée, WCF crée une nouvelle instance à l’aide de la GetInstance méthode.
Notes
Si le InstanceContextMode du service est Single, le système n'appelle pas les méthodes GetInstance et ReleaseInstance, même si l'utilisateur n'a pas fourni d'objet de service connu, sauf si l'utilisateur appelle directement ReleaseServiceInstance puis GetServiceInstance.
Méthodes
GetInstance(InstanceContext) |
Retourne un objet de service en fonction de l'objet InstanceContext spécifié. |
GetInstance(InstanceContext, Message) |
Retourne un objet de service en fonction de l'objet InstanceContext spécifié. |
ReleaseInstance(InstanceContext, Object) |
Appelé lorsqu'un objet InstanceContext recycle un objet de service. |