Instanciação

O exemplo de instanciação demonstra a configuração de comportamento de instanciação, que controla como as instâncias de uma classe de serviço são criadas em resposta às solicitações do cliente. O exemplo baseia-se na Introdução, que implementa o contrato de serviço ICalculator. Este exemplo define um novo contrato, ICalculatorInstanceque herda de ICalculator. O contrato especificado por ICalculatorInstance fornece três operações adicionais para inspecionar o estado da instância de serviço. Ao alterar a configuração de instanciação, você pode observar a alteração no comportamento executando o cliente.

Nesta amostra, o cliente é um aplicativo de console (.exe) e o serviço é hospedado pelos Serviços de Informações da Internet (IIS).

Observação

O procedimento de instalação e as instruções de compilação dessa amostra estão no final deste tópico.

Os seguintes modos de instanciação estão disponíveis:

  • PerCall: uma nova instância de serviço é criada para cada solicitação de cliente.

  • PerSession: uma nova instância é criada para cada nova sessão de cliente e mantida para o tempo de vida dessa sessão (requer uma associação que dá suporte à sessão).

  • Single: uma única instância da classe de serviço manipula todas as solicitações de cliente para o tempo de vida do aplicativo.

A classe de serviço especifica o comportamento de instanciação com o atributo [ServiceBehavior(InstanceContextMode=<setting>)], conforme mostrado no exemplo de código a seguir. Alterando quais linhas são comentadas, você pode observar o comportamento de cada um dos modos de instância. Lembre-se de recompilar o serviço depois de alterar o modo de instanciação. Não há configurações relacionadas à instanciação a serem especificadas no cliente.

// Enable one of the following instance modes to compare instancing behaviors.
 [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]

// PerCall creates a new instance for each operation.
//[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

// Singleton creates a single instance for application lifetime.
//[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculatorInstance
{
    static Object syncObject = new object();
    static int instanceCount;
    int instanceId;
    int operationCount;

    public CalculatorService()
    {
        lock (syncObject)
        {
            instanceCount++;
            instanceId = instanceCount;
        }
    }

    public double Add(double n1, double n2)
    {
        operationCount++;
        return n1 + n2;
    }

    public double Subtract(double n1, double n2)
    {
        Interlocked.Increment(ref operationCount);
        return n1 - n2;
    }

    public double Multiply(double n1, double n2)
    {
        Interlocked.Increment(ref operationCount);
        return n1 * n2;
    }

    public double Divide(double n1, double n2)
    {
        Interlocked.Increment(ref operationCount);
        return n1 / n2;
    }

    public string GetInstanceContextMode()
    {   // Return the InstanceContextMode of the service
        ServiceHost host = (ServiceHost)OperationContext.Current.Host;
        ServiceBehaviorAttribute behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
        return behavior.InstanceContextMode.ToString();
    }

    public int GetInstanceId()
    {   // Return the id for this instance
        return instanceId;
    }

    public int GetOperationCount()
    {   // Return the number of ICalculator operations performed
        // on this instance
        lock (syncObject)
        {
            return operationCount;
        }
    }
}

static void Main()
{
    // Create a client.
    CalculatorInstanceClient client = new CalculatorInstanceClient();
    string instanceMode = client.GetInstanceContextMode();
    Console.WriteLine("InstanceContextMode: {0}", instanceMode);
    DoCalculations(client);

    // Create a second client.
    CalculatorInstanceClient client2 = new CalculatorInstanceClient();

    DoCalculations(client2);

    Console.WriteLine();
    Console.WriteLine("Press <ENTER> to terminate client.");
    Console.ReadLine();
}

Quando você executa a amostra, as solicitações de operação e as respostas são exibidas na janela do console do cliente. O modo de instância em que o serviço está sendo executado é exibido. Após cada operação, a ID da instância e a contagem de operações são exibidas para refletir o comportamento do modo de instanciação. Pressione ENTER na janela do cliente para desligar o cliente.

Para configurar, compilar, e executar o exemplo

  1. Verifique se você executou o Procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. Para compilar a edição .NET do C# ou do Visual Basic da solução, siga as instruções contidas em Como Compilar as Amostras do Windows Communication Foundation.

  3. Para executar a amostra em uma configuração de computador único ou entre computadores, siga as instruções contidas em Como executar as amostras do Windows Communication Foundation.