インスタンス化のサンプルでは、インスタンス化動作の設定を示します。この設定では、クライアント要求に応答してサービス クラスのインスタンスを作成する方法を制御します。 このサンプルは、 サービス コントラクトを実装するICalculator
に基づいています。 このサンプルでは、ICalculator
から継承する新しいコントラクト (ICalculatorInstance
) を定義します。
ICalculatorInstance
によって指定されたコントラクトは、サービス インスタンスの状態を検査するための 3 つの追加操作を提供します。 インスタンス化設定を変更することで、クライアントを実行して動作の変化を観察できます。
このサンプルでは、クライアントはコンソール アプリケーション (.exe) であり、サービスはインターネット インフォメーション サービス (IIS) によってホストされています。
注
このサンプルのセットアップ手順とビルド手順は、このトピックの最後にあります。
次のインスタンス化モードを使用できます。
PerCall: クライアント要求ごとに新しいサービス インスタンスが作成されます。
PerSession: 新しいインスタンスが新しいクライアント セッションごとに作成され、そのセッションの有効期間中維持されます (セッションをサポートするバインディングが必要です)。
Single: サービス クラスの 1 つのインスタンスが、アプリケーションの有効期間中のすべてのクライアント要求を処理します。
サービス クラスは、次のコード サンプルに示すように、 [ServiceBehavior(InstanceContextMode=<setting>)]
属性を使用してインスタンス化動作を指定します。 コメント アウトする行を変更することで、各インスタンス モードの動作を確認できます。 インスタンス化モードを変更した後は、サービスをリビルドすることを忘れないでください。 クライアントで指定するインスタンス関連の設定はありません。
// 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 キーを押して、クライアントをシャットダウンします。
サンプルを設定、ビルド、実行するには
Windows Communication Foundation サンプル のOne-Time セットアップ手順を実行していることを確認します。
ソリューションの C# または Visual Basic .NET エディションをビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
単一または複数のコンピューター間の構成でサンプルを実行するには、「Windows Communication Foundation Samplesの実行」の手順に従います。