2

ASP.NET アプリケーションのリポジトリ クラスの範囲を理解しようとしています。各リクエストは個別のスレッドで実行されるため、リクエストスコープではスレッドセーフであると思います。しかし、それをシングルトンにするのはどうですか、それは有効なシナリオですか。

これらのクラスには状態がなく、データを操作するメソッドしかないため、これらのメソッドを実行する異なるスレッドは異なるスタック フレームを持つ可能性があります。私の理解は正しいですか、誰でもより多くの洞察を提供できますか。

interface ICustomerRepository
{
   List<Customers> GetAll();
   Customer GetById(int id);
}

public class Customer : ICustomerRepository
{
   //implement methods

}
4

1 に答える 1

4

同時実行環境のシングルトンとしてリポジトリを公開することは、悪い考えです。

同時に使用しても安全な方法でインターフェイス リポジトリを実装することもできますが、これは、同時実行の一貫性の唯一の保証が実装のどこかにあることを意味します同時呼び出しが失敗しないことを強制する他のメカニズムはありません。プログラミング言語レベル (リポジトリ インターフェイス) でのコントラクトは、そのような要件を表現するには弱すぎます。

一方、各 http コンテキストが独自のインスタンスを取得する場合、実装の詳細は重要ではありません。

オブジェクトの有効期間についてもっと読むことをお勧めします。シングルトンは、寿命を制御するというより一般的な考え方の具体例にすぎません。一時的な有効期間を持つオブジェクト、アプリケーションの有効期間中単一のインスタンスで共有されるオブジェクトだけでなく、スレッドまたは http コンテキスト (複数のスレッドにまたがる可能性がある) のコンテキスト内に存在するオブジェクトも持つことができます。ライフタイムを制御する方法の 1 つは、インスタンスを作成するファクトリを用意することです。

シンプルなものが必要な場合は、シングルトンのように見えますが、任意の方法で寿命を制御するものを使用できます。

http://netpl.blogspot.com/2010/12/container-based-pseudosingletons-in.html

于 2013-04-03T18:18:19.953 に答える