【问题标题】:Should I have multiple repositories?我应该有多个存储库吗?
【发布时间】:2017-03-30 08:54:08
【问题描述】:

拥有多个存储库会增加资源使用率吗?

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

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

【问题讨论】:

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


    【解决方案1】:

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

    是的。没有。

    通常您希望每个实体类型有一个存储库,因为每个实体类型很可能需要除陈词滥调的 CRUD 操作之外的特定于其类型的操作。存储库的目的是消除重复的数据查询逻辑,否则会在您的应用程序中乱扔垃圾。

    例如

    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 是如何根据实体类型定制的。如果你不这样做,你的单个 repo 会很快

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

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

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

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

    拥有多个存储库会增加资源使用率吗?

    通常不会,因为对于任何给定的操作,您感兴趣的所有存储库都将附加相同的数据库上下文实例。昂贵的是上下文,而不是 repo。

    告诉我更多

    【讨论】:

    • 谢谢。这是一个非常有用的答案。
    • 不用担心,先生。 Mosh 的视频也给了我一些很棒的建议 :)
    • 这是一个很好的答案。更多参考资料可能会对人们有所帮助:通用存储库实现:deviq.com/repository-pattern 并使用 CachedRepository 模式实现缓存:ardalis.com/introducing-the-cachedrepository-pattern
    • @ssmith 感谢好哥们的客气话和精细链接。
    【解决方案2】:

    如提供的链接所示,可以使用存储库模式将数据访问抽象到接口中,例如:ITodoRepository

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-24
      • 2010-09-12
      • 2011-07-17
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2011-05-24
      • 1970-01-01
      相关资源
      最近更新 更多