2

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

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

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

public class Customer : ICustomerRepository
{
   //implement methods

}
4

1 回答 1

4

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

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

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

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

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

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

于 2013-04-03T18:18:19.953 回答