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


How should I create my Data Mappers/Domain Objects/Services?

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

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

工厂?

但随后:

  • 我必须使用反射来实际强制执行对象是否实现了某个接口(通常DataMapper。其他人没有他们需要实现的设置方法;我不想依赖名称,因为命名约定会改变)。
  • 我必须藐视得墨忒耳定律,将工厂传递到服务工厂,然后服务工厂只会将其传递给它创建的服务。

new关键词?

但随后:

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

别的东西?

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

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

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

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

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

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

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