IInstanceProvider Interfejs
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Deklaruje metody, które zapewniają obiekt usługi lub przetwarzają obiekt usługi dla usługi Windows Communication Foundation (WCF).
public interface class IInstanceProvider
public interface IInstanceProvider
type IInstanceProvider = interface
Public Interface IInstanceProvider
Przykłady
Poniższy przykład kodu pokazuje, jak zaimplementować IInstanceProvider zachowanie "pojedynczego" — zawsze zwraca to samo wystąpienie usługi i nie przetwarza go.
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
W poniższym przykładzie kodu pokazano, jak zaimplementować atrybut niestandardowy, który implementuje IContractBehavior wstawianie niestandardowego dostawcy wystąpienia usługi. Implementuje IContractBehaviorAttributerównież element , który wiąże jego użycie z określonym kontraktem.
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
Uwagi
Zaimplementuj interfejs, IInstanceProvider aby kontrolować tworzenie i odtwarzanie obiektów usługi, gdy jest on żądany lub usuwany przez InstanceContext obiekt.
Po zaimplementowaniu interfejsu IInstanceProvider należy przypisać obiekt niestandardowego dostawcy wystąpień do InstanceProvider właściwości przy użyciu zachowania punktu końcowego ( IEndpointBehavior obiektu) lub zachowania kontraktu ( IContractBehavior obiektu).
Jeśli mechanizm wstawiania jest zachowaniem punktu końcowego, można również zaimplementować BehaviorExtensionElement obiekt, który może wstawić niestandardowe zachowanie przy użyciu pliku konfiguracji. Jeśli mechanizm wstawiania jest zachowaniem kontraktu, możesz wstawić zachowanie programowo przed otwarciem hosta usługi lub zaimplementować atrybut niestandardowy. (Przykładowe podejście do zachowania kontraktu można znaleźć w sekcji Przykład).
IInstanceProvider ma dwie metody GetInstance i ReleaseInstance. Te metody są zwykle implementowane w celu tworzenia obiektów usługi przy użyciu konstruktora bez parametrów lub inicjowania lub usuwania pewnego stanu związanego z okresem istnienia obiektu. Buforowanie obiektów usługi to jeden z przykładów funkcji niestandardowych IInstanceProvider .
Zazwyczaj obiekt InstanceContext wywołuje GetInstance metodę po utworzeniu InstanceContext elementu i wywołuje metodę ReleaseInstance po InstanceContext zamknięciu.
Istnieją dwa sposoby, aby spowodować InstanceContext zwolnienie obiektu usługi przed zamknięciem InstanceContext obiektu usługi. Pierwszą metodą jest ustawienie wartości ReleaseInstanceMode AfterCall lub BeforeAndAfterCall. Drugą ReleaseServiceInstance metodą jest wywołanie metody . W takim przypadku InstanceContext wywoła metodę ReleaseInstance dostawcy wystąpienia dyspozytora. Jeśli po wydaniu wystąpienia zostanie wyświetlony nowy komunikat, program WCF utworzy nowe wystąpienie przy użyciu GetInstance metody .
Uwaga
InstanceContextMode Jeśli usługa to Single, system nie wywołuje metod lub ReleaseInstance nawet wtedy, gdy użytkownik nie dostarczył dobrze znanego obiektu usługi, chyba że użytkownik bezpośrednio GetInstance wywołuje, ReleaseServiceInstance a następnie wywołuje GetServiceInstancemetodę .
Metody
GetInstance(InstanceContext) |
Zwraca obiekt usługi nadany określonemu InstanceContext obiektowi. |
GetInstance(InstanceContext, Message) |
Zwraca obiekt usługi nadany określonemu InstanceContext obiektowi. |
ReleaseInstance(InstanceContext, Object) |
Wywoływana, InstanceContext gdy obiekt przetwarza obiekt usługi. |