如何实现ASP.NET跨会话数据控制器类?

时间:2011-02-24 07:31:59

标签: asp.net-mvc

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

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

所以:

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

编辑:

自从@ TomTom回答以来,我一直在研究控制器类作为反模式的想法。我不相信这种或那种方式。

我仍然需要回答上面的问题#3。让我们暂时放弃控制器类的具体想法。如何创建任何类:

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

2 个答案:

答案 0 :(得分:1)

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

一般情况下,使用更新通知保留内存很难做得很好。并且需要正确的数据范围(范围有限)或者内存不足。控制器类是反模式。大多数人认为是好的。以“每个对象一个”的形式,而不是“存在所有东西的存储库”。

答案 1 :(得分:1)

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

您实际描述的内容更像是Repository模式,尽管没有单例性质。使用Inversion of Control和Dependancy Injection容器来制作存储库单例肯定是可能的。

然而,您将遇到的更大问题是会话在Web应用程序中是虚构的。它们并不存在(尽管框架尝试让你认为它们确实存在)。

基本上,只有当某人主动连接到该站点并且正在发布或获取HTTP数据时,才会存在Web应用程序。一旦请求完成,应用程序基本上处于不确定状态。经过一段时间的不活动后,即使假的会话超时,也没有什么,直到下一个人连接。

因此,“交叉会话”的概念在Web应用程序中实际上毫无意义,因为您永远不会知道其他人何时连接,您是否可以实际向其他会话发送事件等...将是一个巨大的痛苦,最多容易出错,最糟糕的是灾难。

您最好的选择就是在数据库中创建一个“事件”表,每个会话都可以在每次执行某些操作时进行检查。那么你可以用这些事件做任何你想做的事情。请记住,网络是无国籍的。