IInstanceProvider Interfaccia
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Dichiara metodi che specificano un oggetto servizio o lo riciclano per un servizio di Windows Communication Foundation (WCF).
public interface class IInstanceProvider
public interface IInstanceProvider
type IInstanceProvider = interface
Public Interface IInstanceProvider
Esempio
Nell'esempio di codice seguente viene illustrato come implementare un oggetto IInstanceProvider che fornisca un comportamento "singleton", restituisca sempre la stessa istanza del servizio e non la ricicli.
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
Nell'esempio di codice seguente viene illustrato come implementare un attributo personalizzato che implementi IContractBehavior al fine di inserire il provider di istanze del servizio personalizzato. Implementa inoltre IContractBehaviorAttribute che ne associa l'utilizzo a un contratto specifico.
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
Commenti
Implementare l'interfaccia IInstanceProvider per controllare la creazione e il riciclaggio di oggetti servizio quando un oggetto InstanceContext ne richiede o ne elimina uno.
Una volta implementata l'interfaccia IInstanceProvider, è necessario assegnare l'oggetto provider di istanze personalizzato alla proprietà InstanceProvider utilizzando un comportamento dell'endpoint (un oggetto IEndpointBehavior) o un comportamento del contratto (un oggetto IContractBehavior).
Se il meccanismo di inserimento è un comportamento dell'endpoint, è anche possibile implementare un oggetto BehaviorExtensionElement in grado di inserire il comportamento personalizzato utilizzando un file di configurazione. Se il meccanismo di inserimento è un comportamento del contratto, è possibile inserire il comportamento a livello di programmazione prima dell'apertura dell'host del servizio o implementare un attributo personalizzato. Per un'esempio dell'approccio relativo al comportamento del contratto, vedere la sezione relativa agli esempi.
L'oggetto IInstanceProvider dispone di due metodi: GetInstance e ReleaseInstance. Questi metodi vengono in genere implementati per creare oggetti di servizio usando un costruttore non senza parametri o per inizializzare o eliminare uno stato correlato alla durata dell'oggetto. Il pooling degli oggetti servizio è un esempio di funzionalità IInstanceProvider personalizzata.
InstanceContext in genere richiama GetInstance quando l'oggetto InstanceContext viene creato inizialmente e chiama il metodo ReleaseInstance quando InstanceContext viene chiuso.
Sono disponibili due modalità per fare in modo che un oggetto InstanceContext rilasci un oggetto servizio prima che InstanceContext venga chiuso. Il primo metodo consiste nell'impostare ReleaseInstanceMode suAfterCall o su BeforeAndAfterCall. La seconda possibilità consiste nel chiamare il metodo ReleaseServiceInstance. Se si procede in questo modo, InstanceContext chiama il metodo ReleaseInstance sul provider di istanze del dispatcher. Se un nuovo messaggio arriva dopo il rilascio dell'istanza, WCF crea una nuova istanza usando il GetInstance metodo .
Nota
Se l'oggetto InstanceContextMode del servizio è Single, il sistema non chiama i metodi GetInstance e ReleaseInstance anche se l'utente non ha fornito un oggetto servizio noto, a meno che l'utente non chiami direttamente ReleaseServiceInstance e quindi GetServiceInstance.
Metodi
GetInstance(InstanceContext) |
Restituisce un oggetto servizio dato l'oggetto InstanceContext specificato. |
GetInstance(InstanceContext, Message) |
Restituisce un oggetto servizio dato l'oggetto InstanceContext specificato. |
ReleaseInstance(InstanceContext, Object) |
Chiamato quando un oggetto InstanceContext ricicla un oggetto servizio. |