C# 存储库 - 如何与其他存储库交互

C# Repository - How to interact with other repositories

我正在重构一些代码,并将一些执行数据库CRUD操作的方法提取到他们自己的存储库中class。

鉴于以下两种类型的对象存储在数据库中,我有几个问题:用户和角色

  1. 我应该创建 IUserRepository 和 IRoleRepository 吗?
  2. 在执行诸如为用户分配角色之类的操作时,该方法 (AssignRoleToUser) 应该放在哪里?在 IUserRepository 或 IRoleRepository 中?
  3. 如果我想添加一些更复杂的逻辑,比方说,IUserRepository.AddUserAndRoles 接受一个 IUser,但也接受一个 IRole 数组, IUserRepository 应该将 IRoleRepository 注入其中吗?

1.Should I create IUserRepository and IRoleRepository?

是否需要对UsersRoles进行操作?如果是,请创建两者。如果您不需要两者但将来可能需要它,则不要创建它,只在需要时创建它。

2.When doing something like assigning a User a Role, where should that method (AssignRoleToUser) live? In IUserRepository or IRoleRepository?

当您将角色分配给用户时,您很可能会将用户添加到该角色。因此,如果该方法在 Role 存储库中,则更具可读性。

3.If I want to add some more complex logic, let's say, IUserRepository.AddUserAndRoles takes an IUser, but also takes an array of IRole, should IUserRepository get an IRoleRepository injected into it?

在顶部使用一个层,它将与 UserRole 存储库交互,并在那里完成复杂的工作。

尽量不要从您的存储库中 return IQueryable(s) - 但是,请记住对此有两种观点。但是,如果您出于性能原因不得不用存储过程替换您的操作之一,或者如果您引入软删除标志,您将感谢我。如果您不公开 IQueryable(s),您将在您的存储库中进行更改。但是如果你公开它,你将需要找到所有的查询并到处更改它们。人们忘记了当他们在 Linq 中编写查询(到 EF 或 SQL)时,他们仍在编写查询,但唯一的区别是他们在 C# 中编写查询。如果他们将它们写在 SQL 中,他们会三思而后行。

另请注意,不要在所有存储库中都从经典的 CRUD、FindAll 等开始。我看到很多这样写的仓库,然后我问了一个问题:但是我们不删除订单,所以为什么我们在 Order 仓库中删除?确保您的存储库反映了您对对象执行的操作。如果您只需要一个 R(出于 CRUD),那么只需创建一个 Read 方法。如果您需要查找,请将其添加到其中。根据需要添加方法。如果你还不需要,请不要编写代码。