IInstanceProvider Interface
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Declara os métodos que fornecem um objeto de serviço ou reciclam um objeto de serviço para um serviço da WCF (Windows Communication Foundation).
public interface class IInstanceProvider
public interface IInstanceProvider
type IInstanceProvider = interface
Public Interface IInstanceProvider
Exemplos
O exemplo de código a seguir mostra como implementar IInstanceProvider o comportamento "singleton"; ele sempre retorna a mesma instância de serviço e não a recicla.
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
O exemplo de código a seguir mostra como implementar um atributo personalizado que implementa para inserir o provedor de instância de IContractBehavior serviço personalizado. Ele também implementa IContractBehaviorAttribute, o que associa seu uso a um contrato específico.
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
Comentários
Implemente a IInstanceProvider interface para controlar a criação e a reciclagem de objetos de serviço quando um for solicitado ou descartado por um InstanceContext objeto.
Depois que a IInstanceProvider interface for implementada, você deverá atribuir seu InstanceProvider objeto de provedor de instância personalizado à propriedade usando um comportamento de ponto de extremidade (um IEndpointBehavior objeto) ou um comportamento de contrato (um IContractBehavior objeto).
Se o mecanismo de inserção for um comportamento de ponto de extremidade, você também poderá implementar um BehaviorExtensionElement objeto que pode inserir seu comportamento personalizado usando um arquivo de configuração. Se o mecanismo de inserção for um comportamento de contrato, você poderá inserir o comportamento programaticamente antes da abertura do host de serviço ou implementar um atributo personalizado. (Para obter um exemplo da abordagem de comportamento do contrato, consulte a seção Exemplo.)
IInstanceProvider possui dois métodos, GetInstance e ReleaseInstance. Normalmente, esses métodos são implementados para criar objetos de serviço usando um construtor sem parâmetros ou para inicializar ou descartar algum estado relacionado ao tempo de vida do objeto. O pool de objetos de serviço é um exemplo de funcionalidade personalizada IInstanceProvider .
Normalmente, o InstanceContext invoca quando GetInstance é InstanceContext criado pela primeira vez e invoca o ReleaseInstance método quando o InstanceContext método é fechado.
Há duas maneiras de fazer com que um InstanceContext objeto libere um objeto de serviço antes de ser InstanceContext fechado. O primeiro método é definir como ReleaseInstanceMode AfterCall ou BeforeAndAfterCall. O segundo método é chamar o ReleaseServiceInstance método. Se isso for feito, o InstanceContext método será chamado ReleaseInstance no provedor de instância do dispatcher. Se uma nova mensagem chegar depois que a instância for liberada, o WCF criará uma nova instância usando o GetInstance método.
Observação
Se o InstanceContextMode serviço forSingle, o sistema não chamará os métodos ou ReleaseInstance os GetInstance métodos mesmo quando o usuário não forneceu um objeto de serviço conhecido, a menos que o usuário ligue ReleaseServiceInstance diretamente e ligueGetServiceInstance.
Métodos
GetInstance(InstanceContext) |
Retorna um objeto de serviço dado o objeto InstanceContext especificado. |
GetInstance(InstanceContext, Message) |
Retorna um objeto de serviço dado o objeto InstanceContext especificado. |
ReleaseInstance(InstanceContext, Object) |
Chamado quando um objeto InstanceContext recicla um objeto de serviço. |