DDD存储库作为单身人士?

时间:2008-11-27 15:03:16

标签: singleton domain-driven-design repository-pattern

快速提问:将我的域驱动设计风格的存储库实现为单身是一个好主意还是一个坏主意?为什么呢?

或者我应该使用依赖注入器容器来管理我的存储库并确定它们是否是单例?

我还在快速阅读 DDD ,并希望看到一些好的存储库示例。

5 个答案:

答案 0 :(得分:3)

使用您的依赖注入容器来决定创建存储库的方式和位置。

使用

UserRepository.Instance.Find(userId);

你正在为测试创造障碍。

如果您的存储库使用构造函数注入传递到服务中,那么您也可以使用模拟轻松替换它们。

答案 1 :(得分:2)

我见过几种方法。

最常见的方法是使用依赖注入将存储库注入使用它们的对象中。通常这些是演示者或控制器类,但在某些情况下,模型调用存储库。通常情况下,如果你避免这种情况会更好。如果你可以使用di-container来做到这一点,那就去吧。

您还可以使存储库实现单例模式。我试图避免这种情况,因为单身人士通常使用静态方法。这可以使测试调用单例的代码更加困难。如果你必须以这种方式做事,那么确保你分离出调用单例的代码并使用“手动”依赖注入将单例注入到调用它们的类中。这摆脱了你原本会得到的一些紧密耦合。

我已经看到了一些存储库永远不会被调用的例子。当有人在模型中导航对象图并请求未加载的对象时,模型只会引发一个事件,并且存储库会对此事件作出反应。这种方式没有调用存储库,它完全与模型分离。我自己并没有使用这种架构,但看起来很干净。

答案 2 :(得分:0)

我不确定这一点,我也有同样的问题。我认为,当经常使用它所使用的对象时,您应该将存储库设置为单例。如果你使用它很少使用的对象,它就不应该成为单例,因为存储库会为对象占用大量内存,并且它可能只被调用一次而在使用应用程序时再也不会被调用。 正如我所说,这可能是不正确的思考。

答案 3 :(得分:0)

假设我有一个非常庞大的项目,我想添加新服务,让我们说它将是我系统中的一些硬件代表。我希望通过许多类可以访问此服务,我希望确保只有一个服务或层的实例可以控制对服务的访问。通过我的所有系统(200多个课程)注入这项服务将是很多工作。对我来说,“Singleton”或某些“服务定位器”非常适合这项任务。

答案 4 :(得分:0)

据我所知,域只包含一个存储库接口,这意味着单个接口可以有许多存储库实现。因此,存储库肯定不能是静态类,因为您无法在接口中定义静态方法。 (注意:在某些语言中,您可以在界面中定义静态方法,但对我来说没有多大意义。)

存储库通常是将实体与数据库,文件等同步。因此它们具有非稳定的依赖性。这意味着他们不能成为单身人士只能拥有环境依赖。这是关于它的article。有趣的部分甚至作者告诉你,你可以在你的领域使用单身。

据我了解,创建一个确保您只有一个实体而不是多个实体的存储库要清晰得多。如果您希望代码符合single responsibility principle,那么这就是存储库的可靠性,而不是实体。