C# 存储库 - 如何与其他存储库交互
C# Repository - How to interact with other repositories
我正在重构一些代码,并将一些执行数据库CRUD操作的方法提取到他们自己的存储库中class。
鉴于以下两种类型的对象存储在数据库中,我有几个问题:用户和角色
- 我应该创建 IUserRepository 和 IRoleRepository 吗?
- 在执行诸如为用户分配角色之类的操作时,该方法 (AssignRoleToUser) 应该放在哪里?在 IUserRepository 或 IRoleRepository 中?
- 如果我想添加一些更复杂的逻辑,比方说,IUserRepository.AddUserAndRoles 接受一个 IUser,但也接受一个 IRole 数组,
IUserRepository 应该将 IRoleRepository 注入其中吗?
1.Should I create IUserRepository and IRoleRepository?
是否需要对Users
和Roles
进行操作?如果是,请创建两者。如果您不需要两者但将来可能需要它,则不要创建它,只在需要时创建它。
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?
在顶部使用一个层,它将与 User
和 Role
存储库交互,并在那里完成复杂的工作。
尽量不要从您的存储库中 return IQueryable
(s) - 但是,请记住对此有两种观点。但是,如果您出于性能原因不得不用存储过程替换您的操作之一,或者如果您引入软删除标志,您将感谢我。如果您不公开 IQueryable
(s),您将在您的存储库中进行更改。但是如果你公开它,你将需要找到所有的查询并到处更改它们。人们忘记了当他们在 Linq 中编写查询(到 EF 或 SQL)时,他们仍在编写查询,但唯一的区别是他们在 C# 中编写查询。如果他们将它们写在 SQL 中,他们会三思而后行。
另请注意,不要在所有存储库中都从经典的 CRUD、FindAll 等开始。我看到很多这样写的仓库,然后我问了一个问题:但是我们不删除订单,所以为什么我们在 Order
仓库中删除?确保您的存储库反映了您对对象执行的操作。如果您只需要一个 R
(出于 CRUD),那么只需创建一个 Read
方法。如果您需要查找,请将其添加到其中。根据需要添加方法。如果你还不需要,请不要编写代码。
我正在重构一些代码,并将一些执行数据库CRUD操作的方法提取到他们自己的存储库中class。
鉴于以下两种类型的对象存储在数据库中,我有几个问题:用户和角色
- 我应该创建 IUserRepository 和 IRoleRepository 吗?
- 在执行诸如为用户分配角色之类的操作时,该方法 (AssignRoleToUser) 应该放在哪里?在 IUserRepository 或 IRoleRepository 中?
- 如果我想添加一些更复杂的逻辑,比方说,IUserRepository.AddUserAndRoles 接受一个 IUser,但也接受一个 IRole 数组, IUserRepository 应该将 IRoleRepository 注入其中吗?
1.Should I create IUserRepository and IRoleRepository?
是否需要对Users
和Roles
进行操作?如果是,请创建两者。如果您不需要两者但将来可能需要它,则不要创建它,只在需要时创建它。
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?
在顶部使用一个层,它将与 User
和 Role
存储库交互,并在那里完成复杂的工作。
尽量不要从您的存储库中 return IQueryable
(s) - 但是,请记住对此有两种观点。但是,如果您出于性能原因不得不用存储过程替换您的操作之一,或者如果您引入软删除标志,您将感谢我。如果您不公开 IQueryable
(s),您将在您的存储库中进行更改。但是如果你公开它,你将需要找到所有的查询并到处更改它们。人们忘记了当他们在 Linq 中编写查询(到 EF 或 SQL)时,他们仍在编写查询,但唯一的区别是他们在 C# 中编写查询。如果他们将它们写在 SQL 中,他们会三思而后行。
另请注意,不要在所有存储库中都从经典的 CRUD、FindAll 等开始。我看到很多这样写的仓库,然后我问了一个问题:但是我们不删除订单,所以为什么我们在 Order
仓库中删除?确保您的存储库反映了您对对象执行的操作。如果您只需要一个 R
(出于 CRUD),那么只需创建一个 Read
方法。如果您需要查找,请将其添加到其中。根据需要添加方法。如果你还不需要,请不要编写代码。