複数のクライアント間で共有されるデータにアクセスできる WCF サービスがあるとします。これら 2 つの設定の違いは何ですか。
1) インスタンス化: 単一、同時実行: 複数、共有データはインスタンス変数に格納されます。
2) インスタンス化: 呼び出しごと、同時実行: 複数、共有データは静的変数に格納されます。
実用的な違いはありますか?いずれにせよ、共有データがスレッドセーフであることを確認する必要がありますが、特定のアプローチに利点があるかどうか疑問に思っています。
複数のクライアント間で共有されるデータにアクセスできる WCF サービスがあるとします。これら 2 つの設定の違いは何ですか。
1) インスタンス化: 単一、同時実行: 複数、共有データはインスタンス変数に格納されます。
2) インスタンス化: 呼び出しごと、同時実行: 複数、共有データは静的変数に格納されます。
実用的な違いはありますか?いずれにせよ、共有データがスレッドセーフであることを確認する必要がありますが、特定のアプローチに利点があるかどうか疑問に思っています。
概念的には、違いはありません。あなたが言ったように、どちらの方法でも、共有データへのアクセスを同期する必要があります。実際には、2 番目のオプションの方が優れています。Juval LowyによるWCF の決定版本、Programming WCF Servicesから:
...呼び出しごとのサービスは、実際には WCF サービスの推奨されるインスタンス管理モードです...一般的なケースではシングルトンを避け、シングルトン インスタンス自体ではなくシングルトンの状態を共有する方法を見つけることをお勧めします。
私は自分のプロジェクトにオプション #2 を使用します。WCF サービス自体は、作業が実行されるクラスの静的メソッドに対する単純なファサードです。例えば、
public class Logger
{
private static List<Logger> _loggers = new List<Logger>();
private static object _sync = new object();
public static void Start()
{
Logger logger = new Logger();
logger.Start();
lock (_sync) {
_loggers.Add( logger );
}
}
private Logger()
{
// construct the Logger object...
}
private void Start()
{
// start the logger here...
}
}
public class LoggingService : ILoggingService
{
public void StartLogger()
{
Logger.Start();
}
}
明らかに、私は詳細の多くを省略しましたが、これは一般的な考え方を示しています。