gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:12:24 27 4
gpt4 key购买 nike

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

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

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

最佳答案

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 存储库进行交互,并在那里完成复杂的工作。

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

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

关于C# 存储库 - 如何与其他存储库交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44171099/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com