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

Mad*_*iha 7 php oop model-view-controller

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

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

工厂?

但是之后:

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

new关键字?

但是之后:

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

还要别的吗?

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

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

Tom*_*m B 1

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

如何将数据映射器实际注入到(可能的)模型层并不重要。依赖注入容器可以存储有关哪些类需要哪些数据映射器的所有元数据,并自动为您注入依赖项。但是,如果不使用 DIC,代码的顶层在最基本的级别上应如下所示:

    $model = new ProductsModel(new ProductsDataMapper(new Db('localhost', 'u', 'p', 'd')));
Run Code Online (Sandbox Code Playgroud)

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

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