2017-05-25 38 views
1

我正在重构一些代码,并提取一些执行数据库CRUD操作到自己的知识库类中的方法。C#知识库 - 如何与其他知识库交互

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

  1. 我应该建立IUserRepository和IRoleRepository?
  2. 当像做一个用户角色这样的事情时,该方法(AssignRoleToUser)应该在哪里?在IUserRepository或IRoleRepository中?
  3. 如果我想添加一些更复杂的逻辑,比方说,IUserRepository.AddUserAndRoles需要一个IUser,但也需要一个IRole数组,如果IUserRepository得到一个IRoleRepository注入它?
+0

为什么要有这么多的仓库,不能只有一个? –

+0

@雷洋这是一个很好的问题。我不确定最佳实践是什么。我不希望我的代码臃肿,有很多方法。 – blgrnboy

+0

我不是专家。但我认为你可以从实体框架中学到一些东西,对于一个数据库只有一个dbcontext,这就够了。 –

回答

1

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

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

2.当做类似分配用户角色的事情时,该方法(AssignRoleToUser)应该在哪里生活?在IUserRepository或IRoleRepository中?

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

3,如果我想添加一些更复杂的逻辑,让我们说,IUserRepository.AddUserAndRoles需要一个IUSER,但也需要IRole数组,IUserRepository应该得到一个IRoleRepository注入呢?

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

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

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

+0

谢谢你的回应!我希望我在正确的道路上,并正在考虑这一点。我的主要驱动器是通过模拟存储库来测试业务逻辑层。我的数据库的一部分由实体框架控制,然后还有一些其他表不属于EF(附加),并由手动SQL脚本控制。你是否建议将EF层放在存储库上? – blgrnboy

+0

是的,因为针对EF的查询仍然是查询。有些人不会同意,但很可能他们正在制作一次性应用程序。但是,我不想在这里为自己的每一个人发动一场战争。但是,是的,既然你问我,我说是的。除非我正在做一个POC或一个短命的应用程序,否则我总是自己也这样做。 – CodingYoshi