인스턴스화 (인스턴스를 생성하거나 사용하는 과정)

Instancing 샘플은 클라이언트 요청에 대한 응답으로 서비스 클래스의 인스턴스를 만드는 방법을 제어하는 인스턴스화 동작 설정을 보여 줍니다. 샘플은 Getting Started에 기반하며, ICalculator 서비스 계약을 구현합니다. 이 샘플은 ICalculatorInstance로부터 상속받는 새 계약 ICalculator을 정의합니다. 지정된 ICalculatorInstance 계약은 서비스 인스턴스의 상태를 검사하기 위한 세 가지 추가 작업을 제공합니다. 인스턴싱 설정을 변경하면 클라이언트를 실행하여 동작의 변화를 관찰할 수 있습니다.

이 샘플에서 클라이언트는 콘솔 애플리케이션(.exe)이며 서비스는 IIS(인터넷 정보 서비스)에서 호스팅됩니다.

비고

이 샘플에 대한 설치 절차 및 빌드 지침은 이 항목의 끝에 있습니다.

다음과 같은 인스턴싱 모드를 사용할 수 있습니다.

  • PerCall: 각 클라이언트 요청에 대해 새 서비스 인스턴스가 만들어집니다.

  • PerSession: 각 새 클라이언트 세션에 대해 새 인스턴스가 만들어지고 해당 세션의 수명 동안 유지 관리됩니다(세션을 지원하는 바인딩 필요).

  • Single: 서비스 클래스의 단일 인스턴스는 애플리케이션의 수명 동안 모든 클라이언트 요청을 처리합니다.

서비스 클래스는 [ServiceBehavior(InstanceContextMode=<setting>)] 특성을 사용하여 인스턴스화 동작을 지정하며, 이는 다음 코드 샘플에 나타나 있습니다. 주석 처리할 줄을 변경하여 각 인스턴스 모드의 동작을 관찰할 수 있습니다. 인스턴싱 모드를 변경한 후 서비스를 다시 빌드해야 합니다. 클라이언트에서 지정할 instancing 관련 설정이 없습니다.

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

샘플을 실행하면 작업 요청 및 응답이 클라이언트 콘솔 창에 표시됩니다. 서비스가 실행 중인 인스턴스 모드가 표시됩니다. 각 작업 후에 인스턴스 ID 및 작업 수가 표시되어 인스턴스 모드의 동작을 반영합니다. 클라이언트 창에서 Enter 키를 눌러 클라이언트를 종료합니다.

샘플을 설정, 빌드 및 실행하려면

  1. Windows Communication Foundation 샘플 에 대한One-Time 설정 절차를 수행했는지 확인합니다.

  2. 솔루션의 C# 또는 Visual Basic .NET 버전을 빌드하려면 Windows Communication Foundation 샘플빌드의 지침을 따릅니다.

  3. 단일 또는 컴퓨터 간 구성에서 샘플을 실행하려면 Windows Communication Foundation 샘플실행의 지침을 따릅니다.