2011-02-24 57 views
0

我正在创建一个ASP.NET应用程序,允许用户编辑和插入持久存储在SQL Server数据库中的数据。我想实现一个控制器类来处理某些实体的查询,缓存结果并在插入或更新数据时触发事件。我需要在我的数据模型中为每个实体使用这些控制器类之一。我不确定的是如何创建不同的用户会话可以访问的这种单例类。如何实现ASP.NET跨会话数据控制器类?

例如,我在我的数据模型中有一个雇员实体。我想要一个EmployeeController类,它处理从数据库检索雇员,向数据库发送插入和更新,保存所有雇员的缓存,并在插入或更新雇员时触发事件。其他用户会话中的对象可以监听并响应这些事件。

所以:

  • 我在正确的轨道上?
  • 我应该使用ASP.NET MVC框架来实现这个吗?
  • 当第一个用户需要它们并让后续的并发用户访问同一个类时,我该如何实例化这些控制器类?

编辑:

我一直在研究,因为@ TomTom的答案控制器类作为一个反模式的想法。我不相信这种或那种方式。

我仍然需要上述问题#3的答案。现在让我们放弃控制器类的具体想法。如何创建任何类,它是:

  1. 由多个用户会话访问,
  2. 只允许一个实例,
  3. 如果没有用户会话被删除,
  4. 触发事件其他班级可以收听。

回答

1

首先,术语“控制器”已经在MVC中使用,并且确实是MVC中的C.你不想混淆这两者。

你实际描述的更像是Repository模式,虽然没有单例本质。当然可以,使用Inversion of Control和Dependancy Injection容器来创建存储库单例。

但是,您将遇到的更大问题是会话在Web应用程序中是虚构的。它们并不存在(尽管框架试图让你认为它们是这样做的)。

从本质上讲,只有当某人正在主动连接到该网站并发布或获取HTTP数据时才会存在Web应用程序。一旦请求完成,应用程序基本上处于闲置状态。经过一段时间的不活动之后,即使假的会话超时,然后也没有任何东西,直到下一个人连接。

因此,“跨会话”的概念在Web应用程序中确实没有意义,因为您永远不会知道别人何时连接,是否可以实际将事件触发到其他会话等。这将是一个巨大的痛苦,充其量是错误,最糟糕的是一场灾难。

最好的办法是简单地在数据库中创建一个“事件”表,每次会话都可以检查每次他们做什么。然后你可以做任何你想要的事情。请记住,网络是无状态的。

1
  • 不,你事实上是在反模式的斜坡上。
  • 你怎么样? MVC处理前端,你计划完全在后端生活。不,你不要。

一般来说,保持thignsin内存更新通知很难 - 正确完成。并且需要正确的数据范围(有限的范围)或内存不足。控制器类是反模式。大多数人认为是好的。以“每个对象一个”的形式,而不是“有一个一切的存储库”。

+0

你是说如果一个控制器类是一个好主意,如果它是每个实体一个,但不是一个好主意,如果它是一切控制器类? – 2011-02-24 08:05:10

+0

每个实体一个是反模式。它破坏了控制器可以处理的很多逻辑(如订购操作),因为它超级细化。 – TomTom 2011-02-24 08:16:42

+0

你能解释一下你的意思吗? – 2011-02-24 08:20:06