【问题标题】:Calling a Repository from a Repository从存储库调用存储库
【发布时间】:2009-10-04 11:09:07
【问题描述】:

我有两个存储库目录和用户,我有一种情况需要从用户存储库调用目录存储库中的方法,这是一种好的做法还是有更好的方法?

【问题讨论】:

  • 问题。我的目录存储库中有一个与评论相关的方法。在我的用户存储库中,我想添加方法 canuserpost (它将查询 db 以查看是否已经制作了足够的 cmets 以允许他们发布)。所需的代码将在两个 repo 中使用,那么根据服务层的 dfa 引用或其他内容,它应该去哪里,一个并引用另一个?

标签: repository-pattern


【解决方案1】:

您不应该在您的存储库中处理此类授权检查。诸如“此用户需要 X cmets 发布”之类的业务规则并不是真正的存储库查询,它是您的用户的属性。

此外,应用程序中的授权调用非常频繁,您真的不希望每次需要检查时都访问数据库。

您应该将这些权限正确加载到您的用户对象中,然后为当前请求缓存该对象,并使用您的域:

public class Service {

    public void Save(Post post)
    {
        if(User.GetCurrentUser().HasEnoughCommentsToPost())
            postRepository.Add(post);
    }

}

【讨论】:

  • 我认为 Save 方法应该是 User 类方法。但是随后 User 类需要了解 postRepo。这是个好主意吗?
【解决方案2】:

我会在上层引用另一个Repository,比如一个服务层

【讨论】:

    【解决方案3】:

    我认为在您的情况下,授权是您的域逻辑的一部分。所以我会在我的域层中创建一个名为 AuthorizationPolicy 的抽象类或接口(也许你可以找到更接近你的域的更好的名称)。在调用存储库上的方法之前,客户端应检查是否具有基于策略的权限。

    另一个解决方案,因为存储库的接口也是业务逻辑的一部分,您可以为存储库创建一个基类,检查用户的权限并将其余部分委托给派生类。

    如果您愿意,AuthorizationPolicy 的实现将与 Catalog 类对话。这样两个存储库就很好地解耦了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2013-02-23
      相关资源
      最近更新 更多