Megosztás a következőn keresztül:


Instancing

Az Instancing-minta bemutatja az instancing viselkedési beállítást, amely azt szabályozza, hogyan jönnek létre egy szolgáltatásosztály példányai az ügyfélkérésekre válaszul. A minta a szolgáltatásszerződést megvalósító ICalculator első lépéseken alapul. Ez a minta egy új szerződést határoz meg, ICalculatorInstanceamely a következőtől ICalculatoröröklődik: . A megadott ICalculatorInstance szerződés három további műveletet biztosít a szolgáltatáspéldány állapotának vizsgálatához. Az instancing beállítás módosításával megfigyelheti a viselkedés változását az ügyfél futtatásával.

Ebben a mintában az ügyfél egy konzolalkalmazás (.exe), és a szolgáltatást az Internet Information Services (IIS) üzemelteti.

Feljegyzés

A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.

A következő instancing módok érhetők el:

  • PerCall: Minden ügyfélkéréshez létrejön egy új szolgáltatáspéldány.

  • PerSession: Minden új ügyfél-munkamenethez létrejön egy új példány, amely a munkamenet teljes élettartama alatt megmarad (a munkamenetet támogató kötést igényel).

  • Single: A szolgáltatásosztály egyetlen példánya kezeli az alkalmazás teljes élettartamára vonatkozó összes ügyfélkérést.

A szolgáltatásosztály az instancing viselkedését adja meg az attribútummal, [ServiceBehavior(InstanceContextMode=<setting>)] ahogyan az a következő kódmintában is látható. A megjegyzésként megadott sorok módosításával megfigyelheti az egyes példánymódok viselkedését. Ne feledje újraépíteni a szolgáltatást az instancing mód módosítása után. Az ügyfélen nincsenek instancinggel kapcsolatos beállítások.

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

A minta futtatásakor a műveleti kérelmek és a válaszok megjelennek az ügyfélkonzol ablakában. Megjelenik az a példánymód, amely alatt a szolgáltatás fut. Minden művelet után megjelenik a példányazonosító és a műveletszám, hogy tükrözze az instancing mód viselkedését. Nyomja le az ENTER billentyűt az ügyfélablakban az ügyfél leállításához.

A minta beállítása, összeállítása és futtatása

  1. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták egyszeri beállítási eljárását.

  2. A megoldás C# vagy Visual Basic .NET kiadásának létrehozásához kövesse a Windows Communication Foundation-minták készítéséhez szükséges utasításokat.

  3. Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse a Windows Communication Foundation-minták futtatásával kapcsolatos utasításokat.