2011-12-16 66 views
6

我有以下设置:MVC> Services> Repositories。现在我想让用户能够将注释添加到文档。只有与文档相关的用户(无论是作为业主或审阅)可以添加注释所以在我NoteService我做以下,以确保用户具有对所选择的文件权限:将方法添加到POCO类

​​

我的问题是,我应该在哪里定义userHasAccess方法?在NoteService中它没有任何意义,因为它正在检查文档。我可以在DocumentService中定义它,但是随后NoteService将需要访问这个,这似乎正在引入更多的耦合。

对我来说,更有意义的是在文档POCO本身上定义它,然后调用document.userHasAccess(...)。这是好的做法,还是应该将POCO域限制为简单的属性?我担心这确实是验证的一部分,通过将该方法放入POCO中,我将分离服务和POCO之间的验证。

我想确保的是我的应用程序易于维护和测试。任何建议,我应该如何解决这个问题将不胜感激!

+0

在POCO 检查这个属性以及不userHasAccess做什么样的检查?代码访问安全性可能适用于您。 – jgauffin 2011-12-16 14:58:52

+0

它只是检查用户是在Document.Owners还是Document.Reviewers中 - 这些是Document和Person之间的多对多关系。 – James 2011-12-16 15:04:37

回答

7

我应该在哪里定义userHasAccess方法?

这是有道理的符合设计的其余部分保持一致,虽然我不知道完整的设计,我至少可以说,在POCO本身)称为UserHasAccess(方法是有道理的。

域POCO应该限于简单的属性吗?

不,域POCO应该包含与对象相关的逻辑(特别是验证逻辑)。否则,它最终会成为一个object with no behaviour - 你应该避免的东西。

但是,不要混淆域(业务)对象和视图对象,它通常只包含很少的逻辑。

您担心您将 服务和POCO之间的验证分开。

我会在POCO中进行验证,并在服务中使用跨域逻辑。

0

任何域实体也可以包含验证方法。

+1

这是不错的做法吗?我不想开始将这些看似简单的方法添加到我的POCO类中,以后才发现难以维护/测试。这将是很好的保留在一个部分的所有验证 - 上面的例子我可以检查用户是否在document.Owners,然后如果在document.Reviewers中,但我需要重复这个逻辑一次又一次,所以它需要成为自己的方法。 – James 2011-12-16 14:21:46

0
  1. 如果您遵循域模型模式,那么您可以添加具有行为的属性。 检查这个由Martin fowler
  2. 如果你正在跟踪表模块模式则在BLL类添加行为和Martin fowler