Bagikan melalui


Instancing

Sampel Instancing menunjukkan setelan perilaku pembuatan instans, yang mengontrol bagaimana instans kelas layanan dibuat sebagai respons terhadap permintaan klien. Sampel didasarkan pada Memulai, yang mengimplementasikan kontrak layanan ICalculator. Sampel ini menentukan kontrak baru, ICalculatorInstance, yang mewarisi dari ICalculator. Kontrak yang ditentukan oleh ICalculatorInstance menyediakan tiga operasi tambahan untuk memeriksa status instans layanan. Dengan mengubah setelan pembuatan instans, Anda dapat mengamati perubahan perilaku dengan menjalankan klien.

Dalam sampel ini, klien adalah aplikasi konsol (.exe) dan layanan di-hosting oleh Layanan Informasi Internet (IIS).

Catatan

Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.

Mode pembuatan instans berikut tersedia:

  • PerCall: Instans layanan baru dibuat untuk setiap permintaan klien.

  • PerSession: Instans baru dibuat untuk setiap sesi klien baru, dan dipertahankan selama masa pakai sesi tersebut (memerlukan pengikatan yang mendukung sesi).

  • Single: Instans tunggal kelas layanan menangani semua permintaan klien selama masa pakai aplikasi.

Kelas layanan menentukan perilaku pembuatan instans dengan atribut [ServiceBehavior(InstanceContextMode=<setting>)] seperti yang ditunjukkan dalam sampel kode yang mengikutinya. Dengan mengubah baris yang dikomentari, Anda dapat mengamati perilaku setiap mode instans. Jangan lupa untuk membangun kembali layanan setelah mengubah mode pembuatan instans. Tidak ada setelan terkait pembuatan instans yang ditentukan pada klien.

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

Saat Anda menjalankan sampel, permintaan dan respons operasi ditampilkan di jendela konsol klien. Mode instans yang dijalankan layanan ditampilkan. Setelah setiap operasi, ID instans dan jumlah operasi ditampilkan untuk mencerminkan perilaku mode pembuatan instans. Tekan ENTER di jendela klien untuk mematikan komputer klien.

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti petunjuknya di Membangun Sampel WCF.

  3. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi pada Menjalankan Sampel WCF.