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

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

提问人:Madara's Ghost 提问时间:10/25/2013 最后编辑:Madara's Ghost 更新时间:8/6/2014 访问量:778

问:

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

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

工厂?

但是:

  • 如果一个对象实现了某个接口(通常)。其他人没有他们需要实现的固定方法;我不想依赖名称,因为命名约定会发生变化)。DataMapper
  • 我必须通过将工厂传递到 ServiceFactory 中来违反得墨忒耳定律,然后 ServiceFactory 只会将其传递给它创建的服务。

关键词是什么?new

但是:

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

别的东西?

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

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

php oop 模型-视图-控制器

评论

1赞 Brian Vanderbusch 10/25/2013
可以使用类型暗示来强制执行类型,而无需使用反射。我建议使用类似 Doctrine2 的东西来为您抽象所有这些。
1赞 Le_Morri 10/25/2013
我通常采用工厂(无反射)并使用spl_autoload来捕获此类依赖关系。当然,这只有在您有一些命名约定(如 PSR-0)时才有效

答:

1赞 Tom B 10/25/2013 #1

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

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

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

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

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

评论

1赞 Madara's Ghost 10/25/2013
你(显然还有 Brian)误解了模型(或者更确切地说,服务)应该如何实际工作。一个服务可以根据需要创建和销毁任意数量的域对象或数据映射器(对于注册,我会创建一个对象,但对于复杂的数据处理,我可能会创建 50 个域对象和 10 个数据映射器,以将它们全部映射到数据库/从数据库映射。User
1赞 Tom B 10/25/2013
我不同意,测绘者本身本质上不应该是短暂的。域对象可以被创建/销毁,但映射器应该是持久的(或者至少在需要它们的服务存在时持续存在)。如果一个服务正在创建 10 个不同的映射器,我认为这暗示了非常糟糕的关注点分离。如果(为了简单起见)每个映射器都与一个数据库表相关,那么从一个类中的 50 个表中访问什么?
1赞 tereško 10/25/2013
为什么你神奇的“产品模型”会意识到拯救自己?
0赞 Tom B 10/25/2013
它只是需要使用数据映射器的服务的一个示例名称。数据映射器将处理加载/保存记录,服务/模型层将使用数据映射器并存储实际处理数据的逻辑。随意用更合适的内容编辑答案。
1赞 Madara's Ghost 5/11/2014
@tereško 那是一个很长的小时。