我应该如何创建我的数据映射器/域对象/服务?

时间:2013-10-24 16:15:45

标签: php oop model-view-controller

所以我用PHP制作这个Web应用程序,我想用Domain Objects和Data Mappers创建一个体面的模型层(尽可能多),所有这些都由Services协调。

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

工厂?

但是:

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

new关键字?

但是:

  • 我在隔离测试代码时遇到了问题。
  • 感觉太紧密了。

还有别的吗?

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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