我有两个存储库目录和用户,我有一种情况需要在用户仓库的目录仓库中调用一个方法,这是一个好的做法还是有更好的方法?
答案 0 :(得分:9)
您不应该在您的存储库中处理这种授权检查。像“此用户需要发布X评论”这样的业务规则实际上不是存储库查询,而是用户的属性。
此外,在应用程序中非常频繁地进行授权调用,并且您确实不希望每次需要检查时都访问数据库。
您应该将这些权限正确加载到User对象中,然后为当前请求缓存该用户对象,并使用您的域名:
public class Service {
public void Save(Post post)
{
if(User.GetCurrentUser().HasEnoughCommentsToPost())
postRepository.Add(post);
}
}
答案 1 :(得分:6)
我会在上层引用其他存储库,例如服务层
答案 2 :(得分:0)
我认为在您的情况下,授权是您的域逻辑的一部分。因此,我将在我的域层中创建一个名为AuthorizationPolicy的抽象类或接口(可能您可以在您的域附近找到更好的名称)。在调用存储库上的方法之前,客户端应检查是否具有基于策略的权限。
另一种解决方案,因为存储库的接口也是业务逻辑的一部分,您可以为存储库创建一个基类,用于检查用户的权限并将其余部分委托给派生类。
如果需要,AuthorizationPolicy的实现将与Catalog类通信。这样两个存储库就可以很好地解耦了。