对于每个具体课程,我都有一个Manager课程。此类包含GetAll()
,GetById()
,Save
等方法
我已将这些管理器类设为Singleton,因为我总是需要一个实例,并且我能够缓存结果。例如,当我调用GetAll()
并且下次再次需要此方法时,管理员不必转到数据库,它可以返回缓存的结果。
这是一个好方法吗?或者有更好的替代方式吗?
答案 0 :(得分:3)
你所谓的经理类实际上是“存储库”
存储库应仅在聚合根级别工作,而不是每个类别一个存储库。例如。如果我有一个具有OrderItem集合的Order类,那么将存在一个具有Get / GetAll方法的Order存储库 - 因为在这种情况下Order是agg根。
所有存储库类通常都是单例类,通常可以通过IOC容器强制执行此操作。
总的来说,我会说你每个实体的一个“存储库”的方法很糟糕 - 而是坚持每个聚合根的一个存储库。
答案 1 :(得分:1)
为什么不把它们作为具体类的一部分而是静态的呢?节省了两个单独的课程。
答案 2 :(得分:1)
听起来你已经接近实施Repository模式了,但并不是那么完整。我建议调查一下。我不会让他们成为单身人士 - 这使得他们很难为你的单元测试嘲笑它们,所以你最终会添加后门以击败Singleton进行测试。缓存是一个很好的Singleton对象,但为什么不简单地以这种方式共享缓存而不是乘以Singletons?
答案 3 :(得分:0)
出于测试/模拟的目的,我建议不要使用Manager / Repository Singleton。
如果您确实要缓存结果,那么我建议委托给专用的Cache类。任何静态魔法都可以包含在Cache类中,并且您的Manager / Repository的语义可以保持干净。
从单一责任原则的角度来看,我应该能够理解管理器/存储库的工作方式,而无需了解您的缓存方案。