我正在创建一个ASP.NET应用程序,允许用户编辑和插入SQL Server数据库中持久存储的数据。我想实现一个控制器类,它处理某些实体的查询,缓存结果并在插入或更新数据时触发事件。我需要为我的数据模型中的每个实体使用其中一个控制器类。我不确定的是如何创建不同用户会话可以访问的此类单例类。
例如,我的数据模型中有一个 Employee 实体。我希望有一个 EmployeeController 类,它处理从数据库中检索员工,向数据库发送插入和更新,保留所有员工的缓存并在插入或更新员工时触发事件。然后,其他用户会话中的对象可以监听并响应这些事件。
所以:
编辑:
自从@ TomTom回答以来,我一直在研究控制器类作为反模式的想法。我不相信这种或那种方式。
我仍然需要回答上面的问题#3。让我们暂时放弃控制器类的具体想法。如何创建任何类:
答案 0 :(得分:1)
一般情况下,使用更新通知保留内存很难做得很好。并且需要正确的数据范围(范围有限)或者内存不足。控制器类是反模式。大多数人认为是好的。以“每个对象一个”的形式,而不是“存在所有东西的存储库”。
答案 1 :(得分:1)
首先,术语“Controller”已经在MVC中使用,并且确实是MVC中的C.你不想混淆两者。
您实际描述的内容更像是Repository模式,尽管没有单例性质。使用Inversion of Control和Dependancy Injection容器来制作存储库单例肯定是可能的。
然而,您将遇到的更大问题是会话在Web应用程序中是虚构的。它们并不存在(尽管框架尝试让你认为它们确实存在)。
基本上,只有当某人主动连接到该站点并且正在发布或获取HTTP数据时,才会存在Web应用程序。一旦请求完成,应用程序基本上处于不确定状态。经过一段时间的不活动后,即使假的会话超时,也没有什么,直到下一个人连接。
因此,“交叉会话”的概念在Web应用程序中实际上毫无意义,因为您永远不会知道其他人何时连接,您是否可以实际向其他会话发送事件等...将是一个巨大的痛苦,最多容易出错,最糟糕的是灾难。
您最好的选择就是在数据库中创建一个“事件”表,每个会话都可以在每次执行某些操作时进行检查。那么你可以用这些事件做任何你想做的事情。请记住,网络是无国籍的。