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

考虑到数据库中存储的以下两种对象,我有几个问题:用户和角色


我应该创建IUserRepository和IRoleRepository吗?
当执行类似为用户分配角色的操作时,该方法(AssignRoleToUser)应该放在哪里?在IUserRepository或IRoleRepository中?
如果我想添加一些更复杂的逻辑,例如,IUserRepository.AddUserAndRoles接受一个I​​User,但也接受一个I​​Role数组,
IUserRepository是否应该将IRoleRepository注入其中?

最佳答案

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


您是否需要在UsersRoles上执行操作?如果是,则同时创建两个。如果您既不需要又需要将来使用,则不要创建它,而仅在需要时创建它。


  2.当执行类似为用户分配角色的操作时,该方法(AssignRoleToUser)应该放在哪里?在IUserRepository或IRoleRepository中?


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


  3,如果我想添加一些更复杂的逻辑,比如说IUserRepository.AddUserAndRoles接受一个I​​User,但也接受一个I​​Role数组,那么IUserRepository是否应该将IRoleRepository注入其中呢?


在最上面使用一个可以与UserRole存储库交互的层,并在那里进行复杂的工作。

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

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

09-07 22:26
查看更多