私が取り組んでいるプロジェクトでは、クラスを特異点として実装しています。このクラスは、システムが実行されているステージ (Dev、Test、Production など) を検出し、それに応じて特定の値を返すことを担当します。これにより、開発チームはそれらの値を使用するたびにステージング設定の処理について心配する必要がなくなります。さらに、別のステージにいるふりをするために、現在のステージをオーバーライドすることができます。
私の懸念は、マルチスレッドが関係しているときに特異点がどのように動作するかを処理する必要があります。以下のコードは、使用される基本的なセットアップの概要を示しています。
私の質問は、 program と program2 が同時に異なるスレッドで実行できる場合、 OverrideStage() 関数 (インスタンスのプライベート変数を変更する) は、他のプログラムの予想される動作に干渉しますか?
例:
1) プログラムが開始され、ステージが DEV に設定されます
2) 別のスレッドで、Program2 が開始され、ステージが PRODUCTION に設定されます
3) プログラムに戻り、値を取得してみます。値は DEV にありますか、それとも PRODUCTION にありますか?
namespace TESTING
{
class Program
{
static void Run()
{
Staging stage = Staging.Instance;
stage.OverrideStage(Staging.DEV);
SqlConnection connDev = new SqlConnection(stage.ConnectionString("example")); // Connection to development database
// Do Stuff
stage.EndOverride();
SqlConnection connBackToAuto = new SqlConnection(stage.ConnectionString("example")); // Connection to detected stage database
}
}
class Program2
{
static void Run()
{
Staging s = Staging.Instance;
s.OverrideStage(Staging.PRODUCTION);
SqlConnection connDev = new SqlConnection(s.ConnectionString("example")); // Connection to production database
// Do stuff
s.EndOverride();
}
}
} // End namespace
質問は次のように単純化できると思います。
とステージはステージングの同じインスタンスですか?