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

本文关键字:单例吗 NET ASP 存储 | 更新日期: 2023-09-27 18:06:25

我试图了解ASP中存储库类的范围。网络应用程序。我认为它们在请求范围内是线程安全的,因为每个请求在单独的线程上运行。但如果它是单例的呢?这是一个有效的方案吗?

因为这些类没有状态,只有操作数据的方法,所以执行这些方法的不同线程可能有不同的堆栈帧。我的理解是正确的,谁能提供更多的见解?

interface ICustomerRepository
{
   List<Customers> GetAll();
   Customer GetById(int id);
}
public class Customer : ICustomerRepository
{
   //implement methods
}

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

为并发环境将存储库暴露为单例是一个糟糕的想法。

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

另一方面,如果每个http上下文都有自己的实例,那么实现细节就无关紧要了。

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

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

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