存储库类可以在 ASP.NET 中定义为单例吗

Sun*_*nny 3 c# asp.net scope

我试图了解 ASP.NET 应用程序中存储库类的范围。我假设它们在请求范围内是线程安全的,因为每个请求都在单独的线程上运行。但是让它成为单例怎么样,这是一个有效的场景吗?

由于这些类没有状态,只有操作数据的方法,因此执行这些方法的不同线程可能具有不同的堆栈帧。我的理解对吗,谁能提供更多见解。

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

public class Customer : ICustomerRepository
{
   //implement methods

}
Run Code Online (Sandbox Code Playgroud)

Wik*_*hla 6

将存储库公开为并发环境的单例是一个主意。

您可以以可以安全并发使用的方式实现接口存储库,但这意味着并发一致性的唯一保证在于实现中的某个地方。没有其他机制可以强制并发调用不会失败,编程语言级别(存储库接口)的契约太弱,无法表达这种要求。

另一方面,如果每个 http 上下文都有自己的实例,则实现细节并不重要。

我建议您阅读更多有关对象生命周期的内容。单例只是控制生命周期的更一般想法的一个具体示例。您可以拥有具有短暂生命周期的对象,在应用程序的生命周期中在单个实例中共享的对象,也可以拥有存在于线程上下文或 http 上下文(可能跨越多个线程)中的对象。控制生命周期的方法之一是拥有一个创建实例的工厂。

如果您需要简单的东西,您可以拥有看起来像单例但以任意方式控制生命周期的东西:

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