1.我应该创建IUserRepository和IRoleRepository吗?
您是否需要在Users
和Roles
上执行操作?如果是,则创建两者。如果你不需要但是将来可能需要它,那么不要创建它,而只需要创建它。
2.当做类似分配用户角色的事情时,该方法(AssignRoleToUser)应该在哪里生活?在IUserRepository或IRoleRepository中?
当您向用户分配角色时,很可能会将用户添加到该角色。因此,如果该方法位于Role
存储库中,则它更具可读性。
3,如果我想添加一些更复杂的逻辑,让我们说,IUserRepository.AddUserAndRoles需要一个IUSER,但也需要IRole数组,IUserRepository应该得到一个IRoleRepository注入呢?
在顶部使用一个图层,它将与User
和Role
存储库交互,并在那里执行复杂的工作。
尽量不要从您的存储库返回IQueryable
(s) - 但是,请记住有两个流派。但是,如果出于性能原因或者如果引入软删除标志,您必须通过存储过程替换您的某个操作,那么您会感谢我。如果您不暴露IQueryable
(s),您将在存储库中进行更改。但是如果你暴露了它,你将需要找到所有的查询,并在任何地方改变它们。人们忘记了当他们在Linq(对EF或SQL)中编写查询时,他们仍在编写查询,但唯一的区别是他们正在使用C#编写它们。如果他们用SQL编写它们,他们会考虑将它们写在所有地方。
另外需要注意的是,不要从所有仓库中的经典CRUD,FindAll等开始。我看过很多类似这样的存储库,然后我问这个问题:但是我们不删除命令,为什么我们要在Order
存储库中删除?确保您的存储库反映您在对象上执行的操作。如果您只需要一个R
(出于CRUD),那么只需创建一个Read
方法即可。如果你需要找到,然后将其添加到它。根据需要添加方法。如果你还不需要,不要编写代码。
为什么要有这么多的仓库,不能只有一个? –
@雷洋这是一个很好的问题。我不确定最佳实践是什么。我不希望我的代码臃肿,有很多方法。 – blgrnboy
我不是专家。但我认为你可以从实体框架中学到一些东西,对于一个数据库只有一个dbcontext,这就够了。 –