存储库模式:复杂的方法去哪儿了?
Repository Pattern: Where do complex methods go?
我很确定我已经很好地理解了如何实现存储库模式,但是我陷入了关于复杂的决策循环 queries/methods。
如果我想获取所有用户或在用户 table 上具有特定字段值的用户,很明显这将进入用户存储库。但是,如果我有一个更复杂的查询——比如所有完成视频课程的用户,视频课程属于这种类型怎么办?在我的模型中,这个查询跨越了大约 6 tables.
我希望能够为我们提供一个存储库来执行类似 if(user.completedVideoRequirement) 的操作,但我很难说服自己用户存储库是执行此操作的地方。这对我来说似乎是正确的,但我可以很容易地反驳自己。
正确的方法是什么?
编辑:如果我 returning 数据库实体以外的信息(即 return true/false 或其他一些 int)怎么办?这甚至应该发生在存储库级别,还是我应该做类似 if(users.CompletedVideoRequirement.Any()) 的事情?
我想这对我来说仍然在用户存储库中是有意义的,因为它是关于用户的信息,但从技术上讲,它也是关于视频的信息。
我的思维过程是"what am I returning"?由于这里的答案是 "Users" 那么 UserRepository 确实是正确的 repo。
为了利用数据库的查询优化,您可能有一百种不同的方式来过滤用户,这些都可以放在 UserRepo 中。 (好吧,一百可能有点矫枉过正)
任何时候您需要一个用户或一组用户,您应该能够转到 UserRepository 来获取它。这就是它的人生目标,根据您的需要过滤用户。
我很确定我已经很好地理解了如何实现存储库模式,但是我陷入了关于复杂的决策循环 queries/methods。
如果我想获取所有用户或在用户 table 上具有特定字段值的用户,很明显这将进入用户存储库。但是,如果我有一个更复杂的查询——比如所有完成视频课程的用户,视频课程属于这种类型怎么办?在我的模型中,这个查询跨越了大约 6 tables.
我希望能够为我们提供一个存储库来执行类似 if(user.completedVideoRequirement) 的操作,但我很难说服自己用户存储库是执行此操作的地方。这对我来说似乎是正确的,但我可以很容易地反驳自己。
正确的方法是什么?
编辑:如果我 returning 数据库实体以外的信息(即 return true/false 或其他一些 int)怎么办?这甚至应该发生在存储库级别,还是我应该做类似 if(users.CompletedVideoRequirement.Any()) 的事情? 我想这对我来说仍然在用户存储库中是有意义的,因为它是关于用户的信息,但从技术上讲,它也是关于视频的信息。
我的思维过程是"what am I returning"?由于这里的答案是 "Users" 那么 UserRepository 确实是正确的 repo。
为了利用数据库的查询优化,您可能有一百种不同的方式来过滤用户,这些都可以放在 UserRepo 中。 (好吧,一百可能有点矫枉过正)
任何时候您需要一个用户或一组用户,您应该能够转到 UserRepository 来获取它。这就是它的人生目标,根据您的需要过滤用户。