一般的なサーバーソフトウェア設計では、ビジネスロジックは一般に「サービス」(データベースやWebサービスなど)を呼び出します。
そのようなシステムを設計するとき、私は各サービスを、システムが起動し、ライフタイム全体で複数の同時リクエストを処理するときに作成されるシングルトンと考えがちです。通常、特定のリクエストの詳細はそれ自体に保存しません。
ただし、サービスの新しいインスタンスが要求ごとにインスタンス化される代替設計があります。個人的には、通常は「サービス」ではなく「ハンドラ」という用語を使用します。
どちらのパターンも同じようにうまく機能するように思えます。どちらか一方を優先する理由、またはこれに関する事実上のベストプラクティスはありますか?
ここには標準またはベストプラクティスはありません。 Webアプリケーションは、デスクトップアプリケーションとは異なるアーキテクチャと寿命を持っています。 Webアプリケーションは、HTTPリクエストごとにこれらのサービスのインスタンスを1つ作成する傾向があります。この理由は、技術スタックによって異なります。
PHP Webアプリケーションの場合、Webアプリケーションは要求ごとに初期化、実行、および破棄されます。NETのWebアプリケーション、JavaおよびRuby技術スタックはサーバーへの最初の要求で初期化され、その後、メインサーバースレッドの下のワーカースレッドから複数のユーザーにサービスが提供されます。Webアプリケーションの領域内でも、コードとそのデータのスコープと存続期間不定。
デスクトップアプリケーションは、最初に開いたときに初期化される傾向があります。アプリケーション内の事柄は、ユーザーインタラクションとユースケースの実行の間に存在できます。アプリケーションを閉じても、すべてが強制終了されるとは限りません。一部は意図的にメモリ内で実行されているプロセスを残します。その他の場合は、ログインするとすぐにアプリケーションの一部が起動します。ここでも、スコープと有効期間は異なります。
コードのパフォーマンスと保守性のバランスが最も良い方を使用します。