7

所以我正在用 PHP 制作这个 Web 应用程序,我想用域对象和数据映射器制作一个体面的模型层(尽可能多),所有这些都由服务编排。

现在我在想,我应该如何创建我的对象?

工厂?

但是之后:

  • 如果一个对象实现了某个接口,我必须使用反射来实际执行(DataMapper通常。其他人没有他们需要实现的设置方法;我不想依赖名称,因为命名约定会改变)。
  • 我必须通过将工厂传递给 ServiceFactory 来违反 demeter 法则,然后它只会将其传递给它创建的服务。

new关键词?

但是之后:

  • 我在单独测试代码时会遇到问题。
  • 感觉耦合太紧了。

还要别的吗?

我不知道,这就是我问的原因!:P

我应该怎么办?有更好的方法吗?

4

1 回答 1

1

Brian Vanderbusch 的评论暗示了最好的方法。您应该使用依赖注入来注入您需要的映射器。但是,为了减少耦合,您还应该键入hint 最基本的类型,通常是接口。

您如何将 Data Mapper 实际注入(大概)模型层并不重要。依赖注入容器可以存储有关哪些类需要哪些数据映射器的所有元数据,并自动为您注入依赖项。但是,如果不使用 DIC,您的代码的顶层应该在最基本的层面上看起来像这样:

    $model = new ProductsModel(new ProductsDataMapper(new Db('localhost', 'u', 'p', 'd')));

当然,映射器和数据库几乎肯定会在现实世界中的其他对象之间共享,并且您将传递对现有实例的引用。如果您需要模型层中的多个映射器,请将它们全部作为构造函数参数传递。

这里的关键是在应用程序的最顶层构建整个对象图,而不是担心事后定位它们。这是控制反转的前提,您可以将其视为从内到外构建结构。

于 2013-10-24T20:26:10.953 回答