2

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

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

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

编辑:我想保持validation, 和CRUD活动尽可能靠近数据层,其中核心 MVC 项目只调用Save()一个对象,数据层验证对象,找出用户修改或创建它的内容并将其保存到数据库。

编辑 2:数据层必须在 MVC 层中绝对没有依赖关系。

4

2 回答 2

2

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

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

您可以考虑在控制器操作周围使用 ActionFilters 创建一个单独的审计跟踪,这样可以轻松访问Session,并可以创建用户执行操作的运行历史记录。这对您的数据库记录可能 100% 正确,也可能不正确,但确实提供了应用程序操作的清晰历史记录——这本身就很有价值。

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


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

如果你真的想要 100% 的审计,你应该看看Event Sourcing设计模式,如果一个动作没有被审计,那么它就没有发生。这是一个与典型的 CRUD 方法非常不同的范例,但非常强大(尽管最初的设计更复杂)


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

于 2013-08-29T17:09:24.290 回答
1

如果您在应用程序中使用这样的结构,您可以定义一些可在整个应用程序中使用的核心接口(ICurrentUserProvider如与应用程序的特定部分紧密耦合或依赖。

项目结构

当您的 Web 项目初始化时,它可以初始化您的 DI 框架,以便您的控制器将其依赖项注入其中。这样,您的控制器获得了它需要的业务层服务,并且这些业务层服务具有他们需要的数据层实现(实际上并不直接依赖于它们),并且数据访问对象获得了可以告诉它谁是当前用户是(不直接依赖于 MVC 层)。

于 2013-08-29T17:49:17.417 回答