我应该有多个存储库吗?

时间:2017-03-29 07:25:26

标签: c# asp.net-core asp.net-core-mvc

是否有多个存储库会增加资源使用量?

我已按照本教程添加了一个包含数据库上下文的存储库服务:https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api

在教程中,存储库用于管理Todo项目。在我自己的应用程序中,我有几种不同类型的项目和活动,我需要一个上下文。我应该为每个创建一个单独的存储库吗?例如,一个用于查询的存储库,另一个用于用户使用指标这样做是否有任何开销或处罚?

2 个答案:

答案 0 :(得分:3)

  

我应该为每个创建一个单独的存储库吗?例如,一个用于查询的存储库,另一个用于用户使用指标这样做是否有任何开销或处罚?

是。否。

通常,您希望每个实体类型一个存储库,因为除了陈词滥调的CRUD操作之外,每个实体类型很可能需要特定于其类型的操作。回购的目的是消除重复的数据查询逻辑,否则会对您的应用程序产生影响。

e.g。

interface IRepo { CRUD }

protected abstract class RepoBase<T> : IRepo 
{
   // CRUD implementation
}

public class PatientRepo : RepoBase<Patient>
{ 
    List<IPatient> GetAllTerminallyIllPatients();
}

public class MusicRepo : RepoBase<Music>
{
    List<ISong> GetAllSongsByArtist (string artist);
}

请注意我的微弱示例中的每个repo如何根据实体类型进行自定义。如果你没有这样做,你的单一回购将很快

  • 很难找到你追求的方法
  • 无法管理100个方法的潜力
  • 由于所有代码都在一个文件中而导致源控制冲突的可能性增加

您可能需要考虑将您的存储库拆分为repos 工作单元类,因为:

  

存储库不应具有数据库的语义。这应该   就像内存中的对象集合一样,不应该像方法那样   更新并保存。 - Mosh

您可以从以下链接中的教程中了解更多信息。

  

是否有多个存储库会增加资源使用量?

通常不会,因为对于任何给定的操作,所有感兴趣的回购附加相同的数据库上下文实例。这是一个昂贵的背景,而不是回购。

告诉我更多

答案 1 :(得分:0)

如提供的链接所示,Repository模式可用于将数据访问抽象为接口,例如:ITodoRepository

为什么要抽象数据访问?通过这种方式,您可以通过实现不同的ITodoRepository类来轻松切换数据访问层。如果您想使用单元测试来测试逻辑,或者如果存在可能性,您将来不再使用实体框架。< / p>

如果不是这种情况,并且您正在构建一个没有此类添加项目的小项目(单元测试/交换机数据访问层)使用存储库模式只是额外的工作而没有任何好处。

因此,您应该决定使存储库模式的额外工作是否超过项目的好处。