IInstanceProvider Interface
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Declara métodos que fornecem um objeto de serviço ou reciclam um objeto de serviço para um serviço da Windows Communication Foundation (WCF).
public interface class IInstanceProvider
public interface IInstanceProvider
type IInstanceProvider = interface
Public Interface IInstanceProvider
Exemplos
O exemplo de código seguinte mostra como implementar IInstanceProvider esse comportamento de "singleton"; devolve sempre 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 seguinte mostra como implementar um atributo personalizado que implementa IContractBehavior a inserção do fornecedor de instância de serviço personalizado. Também implementa IContractBehaviorAttribute, que vincula a sua utilização 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
Observações
Implemente a IInstanceProvider interface para controlar a criação e reciclagem de objetos de serviço quando um deles é solicitado ou descartado por um InstanceContext objeto.
Uma vez implementada a IInstanceProvider interface, deve atribuir o seu objeto provedor de instância personalizado à InstanceProvider propriedade usando um comportamento de endpoint (um IEndpointBehavior objeto) ou um comportamento de contrato (um IContractBehavior objeto).
Se o mecanismo de inserção for um comportamento de endpoint, também podes implementar um BehaviorExtensionElement objeto que possa inserir o teu comportamento personalizado usando um ficheiro de configuração. Se o mecanismo de inserção for um comportamento de contrato, pode inserir o comportamento programaticamente antes da abertura do host de serviço ou pode implementar um atributo personalizado. (Para um exemplo da abordagem do comportamento contratual, veja a secção Exemplo.)
IInstanceProvider tem dois métodos, GetInstance e ReleaseInstance. Estes métodos são tipicamente implementados para criar objetos de serviço usando um construtor não sem parâmetros ou para inicializar ou eliminar algum estado relacionado com a vida útil do objeto. O pooling de objetos de serviço é um exemplo de funcionalidade personalizada IInstanceProvider .
Normalmente, o InstanceContext invoca quando GetInstance o InstanceContext é criado pela primeira vez e invoca o ReleaseInstance método quando o InstanceContext está fechado.
Existem duas formas de fazer com que um InstanceContext objeto liberte um objeto de serviço antes de ser InstanceContext fechado. O primeiro método é definir o ReleaseInstanceMode para AfterCall ou BeforeAndAfterCall. O segundo método é chamar o ReleaseServiceInstance método. Se isto for feito, chama InstanceContext o ReleaseInstance método para o fornecedor de instâncias do despachante. Se uma nova mensagem chegar após a instância ter sido libertada, o WCF cria uma nova instância usando o GetInstance método.
Note
Se o InstanceContextMode do serviço for Single, o sistema não chama os GetInstance métodos ou ReleaseInstance mesmo quando o utilizador não forneceu um objeto de serviço bem conhecido, a menos que o utilizador chame ReleaseServiceInstance diretamente e depois chame GetServiceInstance.
Métodos
| Name | Description |
|---|---|
| GetInstance(InstanceContext, Message) |
Devolve um objeto de serviço dado o objeto especificado InstanceContext . |
| GetInstance(InstanceContext) |
Devolve um objeto de serviço dado o objeto especificado InstanceContext . |
| ReleaseInstance(InstanceContext, Object) |
Chamado quando um InstanceContext objeto recicla um objeto de serviço. |