必要な概念は IoC/DI と呼ばれ、これには多くのフレームワークがあります。CustomerService のようなクラスがあり、定義上依存関係である CustomerRepository が必要な場合、CustomerService のコンストラクターを介して渡す必要がありますが、どこで CustomerService をインスタンス化するかという問題があります。まあ、誰がそのサービスを使用するかは、コンストラクターを介して取得する必要があります。それはおそらく、CustomerPresenter やその他のクラスであり、無関係です。私のポイントは、依存性注入を行うことで、IoC / DI フレームワークがルールに従ってそれらの依存性を解決する非常に単一のポイントにコードを構造化するということです。
プログラムの一番上に、次のようなものがあります。
ICustomerPresenter presenter = IoC.Resolve<ICustomerPresenter>();
すべてが舞台裏で自動的にまとめられます。
これを実現するために、StructureMap を使用した例を次に示します。
For<ICustomerPresenter>().Use<CustomerPresenter>();
For<ICustomerService>().Singleton().Use<CustomerService();
For<ICustomerRepository>().Singleton().Use<CustomerRepository>();
これにより、テスト容易性を維持できます。ここではかなり単純化したので、そのままではあまり使用できませんが、オンラインで IoC / DI のリソースがたくさんあるので、チェックしてみてください。
注: Web アプリケーションの場合、リクエストごとの処理ライフサイクルを確認する必要があります。Web アプリケーション全体でシングルトンを使用することはめったにありません。