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

时间:2017-05-25 01:57:36

标签: c# asp.net repository-pattern

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

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

  1. 我应该创建IUserRepository和IRoleRepository吗?
  2. 在执行像分配用户角色这样的方法时,该方法(AssignRoleToUser)应该在哪里生效?在IUserRepository还是IRoleRepository?
  3. 如果我想添加一些更复杂的逻辑,让我们说,IUserRepository.AddUserAndRoles需要一个IUser,但也需要一个IRole数组, IUserRepository应该将IRoleRepository注入其中吗?

1 个答案:

答案 0 :(得分:2)

  

1.我应该创建IUserRepository和IRoleRepository吗?

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

  

2.在为用户分配角色时,该方法(AssignRoleToUser)应该在哪里生效?在IUserRepository还是IRoleRepository?

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

  

3.如果我想添加一些更复杂的逻辑,让我们说,IUserRepository.AddUserAndRoles需要一个IUser,但是如果IUserRepository注入一个IRoleRepository,它还需要一个IRole数组?

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

尽量不要从您的存储库中返回IQueryable - 但是,请记住,有两种思想流派。但是,如果由于性能原因或者引入了软删除标志而必须通过存储过程替换其中一个操作,那么您将感谢我。如果您不公开IQueryable(s),您将在存储库中进行更改。但是如果你暴露它,你将需要找到所有的查询并在任何地方进行更改。人们忘记了当他们在Linq中编写查询(到EF或SQL)时,他们仍然在编写查询,但唯一的区别是他们是用C#编写的。如果他们在SQL中编写它们,他们会三思而后行于整个地方编写它们。

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