我正在重构一些代码,并将执行数据库CRUD操作的一些方法提取到自己的存储库类中。
考虑到数据库中存储的以下两种对象,我有几个问题:用户和角色
我应该创建IUserRepository和IRoleRepository吗?
当执行类似为用户分配角色的操作时,该方法(AssignRoleToUser)应该放在哪里?在IUserRepository或IRoleRepository中?
如果我想添加一些更复杂的逻辑,例如,IUserRepository.AddUserAndRoles接受一个IUser,但也接受一个IRole数组,
IUserRepository是否应该将IRoleRepository注入其中?
最佳答案
1.我应该创建IUserRepository和IRoleRepository吗?
您是否需要在Users
和Roles
上执行操作?如果是,则同时创建两个。如果您既不需要又需要将来使用,则不要创建它,而仅在需要时创建它。
2.当执行类似为用户分配角色的操作时,该方法(AssignRoleToUser)应该放在哪里?在IUserRepository或IRoleRepository中?
将角色分配给用户时,很可能会将用户添加到该角色。因此,如果该方法位于Role
存储库中,则更具可读性。
3,如果我想添加一些更复杂的逻辑,比如说IUserRepository.AddUserAndRoles接受一个IUser,但也接受一个IRole数组,那么IUserRepository是否应该将IRoleRepository注入其中呢?
在最上面使用一个可以与User
和Role
存储库交互的层,并在那里进行复杂的工作。
尽量不要从存储库中返回IQueryable
,但是请记住,有两个思路。但是,如果出于性能原因而不得不用存储过程替换您的操作之一,或者引入了软删除标志,您将表示感谢。如果不公开IQueryable
,则将在存储库中进行更改。但是,如果您公开了它,则将需要查找所有查询并在各处进行更改。人们会忘记,当他们使用Linq(针对EF或SQL)编写查询时,他们仍然在编写查询,但是唯一的区别是他们使用C#编写了查询。如果他们使用SQL编写代码,那么他们会三思而后行地编写它们。
另外请注意,请勿在所有存储库中以经典的CRUD,FindAll等开头。我已经看到许多这样写的存储库,然后我问一个问题:但是我们不删除订单,所以为什么在Order
存储库中有一个删除?确保您的存储库反映了您对对象执行的操作。如果您只需要一个R
(不在CRUD中),则只需创建一个Read
方法。如果需要查找,则将其添加到其中。根据需要添加方法。如果不需要,请不要编写代码。