これが、クラスの有効期間を自分で管理するのではなく、 AutofacやUnityなどの制御の反転 (IoC) コンテナーを使用すると便利な理由の 1 つです。次に、他のクラスと同じように見えるクラスを作成し、IoC コンテナーにそれをシングルトンとしてインスタンス化するように指示します。
Autofac Lifetime Primerも参照してください。
IoC コンテナーを使用できない場合 (何も考えられませんが、柔軟に対応しましょう)、internal
「シングルトン」のロジックを含むクラスを作成できます。この内部クラスは、まさに内部クラスです。クラス、シングルトンではありません...
internal class MyLogic
{
...
}
そして、それを public クラスにラップして、それをシングルトンにします。これらの両方のクラスを 1 つのプロジェクトにまとめた場合、アプリケーションは内部クラス (ビジネス ロジックの実装) にアクセスできず、パブリック シングルトン バージョンのみにアクセスできます。
public sealed class MySingleton
{
private MySingleton() { Implementation = new MyLogic(); }
public static MySingleton Instance { ... }
private MyLogic Implementation { get; set; }
...
}
AssemblyInfo
ただし、ユニットテストプロジェクトが内部クラスにアクセスできることを指摘することができます
[assembly: InternalsVisibleTo("MySolution.UnitTests")]
このようにして、アプリケーションがロジック クラスをシングルトンとしてしか使用できない場合でも、ロジック クラスを単体テストできます。
率直に言って、私は IoC の方法を好みますが、それが初めての場合は、代わりに上記のソリューションを実装する方がおそらく高速です。
幸運を!