向POCO类添加方法

时间:2011-12-16 13:55:34

标签: asp.net-mvc asp.net-mvc-3 validation poco

我有以下设置:MVC>服务>库。现在我想让用户能够为文档添加注释。只有与文档关联的用户(作为所有者或审阅者)才能添加Notes,因此在我的NoteService中,我执行以下操作以确保用户对所选文档具有权限:

public Note GetNewNote(int documentID)
    {
        if (!userHasAccess(Thread.CurrentPrincipal.Identity.Name))
            throw new BusinessLogicException();

        // Other stuff here...
    }

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

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

我要确保的是我的应用程序易于维护和测试。关于如何解决这个问题的任何建议都将非常感激!

3 个答案:

答案 0 :(得分:6)

  

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

与设计的其余部分保持一致是有意义的,而我不知道完整的设计我至少可以说POCO本身的一个名为UserHasAccess()的方法是有道理的。

  

域名POCO是否应限于简单属性?

不,域POCO应包含与该对象相关的逻辑(尤其是验证逻辑)。否则,它最终成为object with no behaviour - 你绝对应该避免的。

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

  

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

我会在POCO和服务中的跨域逻辑中进行验证。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  1. 如果您正在关注域模型模式,则可以添加具有行为的属性。 请Martin fowler
  2. 查看
  3. 如果您正在关注表模块模式,则在POCO中添加BLL类和属性中的行为 通过Martin fowler
  4. 检查这一点