c# - 用于实现 LastUpdated 和 UpdatedBy 的设计模式

标签 c# asp.net asp.net-mvc design-patterns

我已经思考这个问题有一段时间了,但没有想到一个可以接受的解决方案。我有一个计划变得非常大的应用程序。正因为如此,我试图将其模块化。它基于MVC4。我还没有决定使用 ORM 或自己映射所有内容。我想要以下结构:

----------------------
| Database
----------------------
| Data/Data Access Layer (Class Library) (Objects reside here)
----------------------
| Core MVC Project (User and Session are stored here)
----------------------
| MVC Modules

我希望使 UpdatedBy 字段的验证尽可能靠近数据库,可能在数据/数据访问层中。问题是我想将 user 存储在 Session 中,并在类库中进行验证(其中没有 Session)。我还想尽可能避免将 user 传递到各处。有没有办法将用户存储在 session 中,并让数据访问层访问该信息,而无需传递用户?有人对如何优雅地做到这一点有任何建议吗?

编辑:我希望保持验证CRUD事件尽可能靠近数据层,核心MVC项目只是调用对象上的 Save() ,数据层验证该对象,找出用户修改或创建它的内容,并将其保存到数据库中。

编辑2:数据层绝对不依赖于MVC层。

最佳答案

可以使用数据库插入/更新上的触发器轻松实现LastUpdated,但UpdatedBy有点棘手。

一个关键问题是“您的业务层是否需要了解谁在使用它?”如果是这样,则可以将界面设计为要求在执行操作时提供用户名。如果不是,那么您需要从业务层内部/后面访问数据,但无需显式提供给它(例如使用依赖项注入(inject),或通过提供始终可用的上下文)。

您可以考虑在 Controller 操作周围使用 ActionFilters 创建单独的审核跟踪,这样可以轻松访问 session ,并且可以创建用户所执行操作的运行历史记录。这可能会或可能不会 100% 正确地记录您的数据库记录,但确实提供了应用程序操作的清晰历史记录 - 这本身就很有值(value)。

您还可以考虑使用Command模式,应用程序可以生成在业务/数据层上执行的特定命令(例如UpdateWidgetName命令)。在某些方面,这就是 MVC 的工作方式,但是拥有一个捕获用户和日期的显式 Command 仍然是对业务层的有用补充。


还要注意将其记录下来本身的缺点。您只会知道谁最后编辑了该记录,而无法具体说明他们编辑了哪些内容,或者之前是谁编辑了该记录。对于相对简单的场景,这通常就足够了,但还远远不能提供实际的历史数据记录。

如果您确实想要 100% 审核,您应该查看事件溯源 设计模式,在该模式中,如果某个操作未经过审核,那么该操作就不会发生。这是与典型的 CRUD 方法非常不同的范例,但非常强大(尽管最初设计起来更复杂)


另一注意事项:考虑将业务和持久性代码分成两层。将它们捆绑在一起会使业务逻辑与持久性紧密耦合(不好),这将阻止其重用。考虑实现一个专门用于保存和检索业务对象的Repository。它得到了返回。

关于c# - 用于实现 LastUpdated 和 UpdatedBy 的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18516839/

相关文章:

c# - 调用 timer.Stop() 后执行的 System.Timers.Timer Elapsed 事件

c# - 如何让 CommonOpenFileDialog 的 InitialDirectory 成为用户的 MyDocuments 路径,而不是 Libraries\Documents?

javascript - 如何使 window.showmodaldialog 在 chrome 37 中工作?

asp.net - 数据库上下文在 base 的数据表中没有看到任何记录

c# - 哪个更利于可读性?

c# - 使用 Roslyn 编译器重定向控制台和调试输出

jquery - 用户点击后如何渲染部分 View (使用 Razor )?

c# - .net activex 在框架 4.0 中不工作

c# - UpdateModel() 有什么作用?

c# - 将 MVC 应用程序作为子应用程序运行?