gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:14:23 24 4
gpt4 key购买 nike

我一直在思考这个问题一段时间,想不出一个可以接受的解决方案。我有一个计划变得非常大的应用程序。因此,我试图将其模块化。它基于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 中,并让数据访问层访问该信息而不传递给 user?有人对如何优雅地执行此操作有任何建议吗?

编辑:我想让validationCRUD事件尽可能靠近Core MVC项目刚刚调用的数据层对象上的 Save() 和数据层验证对象,找出用户修改或创建它并将其保存到数据库。

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

最佳答案

LastUpdated 可以通过数据库插入/更新上的 Trigger 轻松实现,但是 UpdatedBy 有点棘手。

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

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

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


另请注意将此记录在案本身的缺点。您将只知道谁最后编辑了记录——您将无法具体说出他们编辑了什么,或者谁之前编辑过。对于相对简单的场景,这通常就足够了,但远不能为记录提供实际的历史数据。

如果您真的想要 100% 的审计,您应该查看 Event Sourcing 设计模式,如果一个操作没有被审计,那么它实际上就没有发生。它与典型的 CRUD 方法截然不同,但非常强大(尽管最初设计起来更复杂)


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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com