ステートレス サービス クラスを使用し、各メソッド呼び出しで静的クラスの状態情報を渡します。クラスの詳細を知らなくても、ac# 静的クラスを使用した別の例を示します。
public static class LegacyCode
{
public static void Initialize(int p1, string p2)
{
//some static state
}
public static void ChangeSettings(bool p3, double p4)
{
//some static state
}
public static void DoSomething(string someOtherParam)
{
//execute based on some static state
}
}
public class LegacyCodeFacadeService
{
public void PerformLegacyCodeActivity(LegacyCodeState state, LegacyCodeParams legacyParams)
{
lock (_lockObject)
{
LegacyCode.Initialize(state.P1, state.P2);
LegacyCode.ChangeSettings(state.P3, state.P4);
LegacyCode.DoSomething(legacyParams.SomeOtherParam);
//do something to reset state, perhaps
}
}
}
空白を少し埋める必要がありますが、アイデアが得られることを願っています。要点は、必要最小限の時間だけ静的オブジェクトの状態を設定し、その間ずっとアクセスをロックして、他の呼び出し元がグローバル状態の変更の影響を受けないようにすることです。このクラスを使用するには、このクラスの新しいインスタンスを作成する必要があるため、完全に注入可能でテスト可能です (インターフェースを抽出するステップを除きますが、簡潔にするためにスキップしました)。
ここでの実装には多くのオプションがあります。たとえば、LegacyCodeState を大幅に変更する必要があるが、少数の特定の状態のみに変更する必要がある場合は、それらの状態を管理する作業を行うオーバーロードを使用できます。
編集
これは多くの点でシングルトンよりも好ましいですが、最も重要なことは、蓄積してグローバル状態に結合することができないということです。これにより、グローバル状態が静的クラスへの唯一のエントリ ポイントである場合、グローバル状態が非グローバル状態に変わります。 . ただし、シングルトンが必要になった場合は、コンストラクターをここにカプセル化することで簡単に切り替えることができます。
public class LegacyCodeFacadeService
{
private LegacyCodeFacadeService() { }
public static LegacyCodeFacadeService GetInstance()
{
//now we can change lifestyle management strategies later, if needed
return new LegacyCodeFacadeService();
}
public void PerformLegacyCodeActivity(LegacyCodeState state, LegacyCodeParams legacyParams)
{
lock (_lockObject)
{
LegacyCode.Initialize(state.P1, state.P2);
LegacyCode.ChangeSettings(state.P3, state.P4);
LegacyCode.DoSomething(legacyParams.SomeOtherParam);
//do something to reset state, perhaps
}
}
}