存储库类可以在ASP.NET中作为单例限定范围

时间:2013-03-29 15:41:32

标签: c# asp.net scope

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

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

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

public class Customer : ICustomerRepository
{
   //implement methods

}

1 个答案:

答案 0 :(得分:2)

将存储库公开为并发环境的单例是错误的想法。

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

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

我建议您阅读有关对象生命周期的更多信息。单例只是控制生命周期的更一般概念的一个具体例子。您可以拥有具有临时生存期的对象,在应用程序生命周期内在单个实例中共享的对象,以及生活在线程或http上下文(可能跨越多个线程)的上下文中的对象。控制生命周期的方法之一是拥有一个创建实例的工厂。

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

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