Partager via


Instanciation

L’exemple d’instanciation illustre le paramètre de comportement d’instanciation, qui contrôle la façon dont les instances d’une classe de service sont créées en réponse aux demandes du client. L’exemple est basé sur Getting Started, qui implémente le contrat de service ICalculator. Cet exemple définit un nouveau contrat, ICalculatorInstancequi hérite de ICalculator. Le contrat spécifié par ICalculatorInstance fournit trois opérations supplémentaires pour inspecter l’état de l’instance de service. En modifiant le paramètre d’instanciation, vous pouvez observer le changement de comportement en exécutant le client.

Dans cet exemple, le client est une application console (.exe) et le service est hébergé par les services IIS (Internet Information Services).

Remarque

La procédure d’installation et les instructions de génération de cet exemple se trouvent à la fin de cette rubrique.

Les modes d’instanciation suivants sont disponibles :

  • PerCall: une nouvelle instance de service est créée pour chaque requête cliente.

  • PerSession: une nouvelle instance est créée pour chaque nouvelle session cliente et conservée pendant la durée de vie de cette session (nécessite une liaison qui prend en charge la session).

  • Single: une seule instance de la classe de service gère toutes les demandes clientes pour la durée de vie de l’application.

La classe de service spécifie le comportement d’instanciation avec l’attribut [ServiceBehavior(InstanceContextMode=<setting>)] , comme indiqué dans l’exemple de code qui suit. Pour observer le comportement de chacun des modes d'instance, modifiez les lignes commentées. N'oubliez pas de régénérer le service après avoir modifié le mode d'instanciation. Il n’existe aucun paramètre lié à l’instanciation à spécifier sur le client.

// 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();
}

Lorsque vous exécutez l’exemple, les demandes et réponses de l’opération s’affichent dans la fenêtre de la console cliente. Le mode d’instance sous lequel le service s’exécute s’affiche. Après chaque opération, l’ID d’instance et le nombre d’opérations sont affichés pour refléter le comportement du mode d’instanciation. Appuyez sur Entrée dans la fenêtre du client pour arrêter le client.

Pour configurer, générer et exécuter l’exemple

  1. Assurez-vous d’avoir effectué la Procédure d’installation unique pour les exemples Windows Communication Foundation.

  2. Pour générer l’édition C# ou Visual Basic .NET de la solution, conformez-vous aux instructions figurant dans Building the Windows Communication Foundation Samples.

  3. Pour exécuter l’exemple dans une configuration à un ou plusieurs ordinateurs, conformez-vous aux instructions figurant dans la rubrique Exécution des exemples Windows Communication Foundation.