1

我有一个将 Doctrine ORM 用于实体的应用程序。遵循 OO 设计,我尝试将尽可能多的业务逻辑推送到实体中。但是我遇到了一个小问题。一些业务逻辑需要在我的外部应用程序配置中定义的变量(因为它们有时需要调整)。我如何在不违反 OO 原则的情况下将它们放入我的实体中?我不想直接从我的实体访问我的全局配置,也不想将这些变量存储在我的实体和数据库中。

这是一个模式的具体示例。我将 PHP 与 Doctrine ORM 一起使用,但同样的 OO 原则适用于 Hibernate (JAVA)、nHibernate (C#) 等。

我的应用程序有产品和用户。有许多不同类型的用户(真正的人类用户、自动化机器人等)。他们都需要处理 Product 对象。所有用户共享同一个 UserInterface,它有一个方法:

class UserInterface {
    function canProcess(Product $product);
}

我有一个在产品和用户之间进行调解的 ProcessService。它只是遍历附加到产品的所有用户,直到找到愿意在那个时候处理它的用户。

class ProcessService {

    // Process a product
    function process(Product $product) {
        foreach ($this->getUsers() as $user) {
            if ($user->canProcess($product)) {
                ...
            }
     }
}

问题是一些用户(在我的例子中是机器人之一)需要有一个外部配置变量才能确定它是否可以处理产品。

我不想将该值存储在我的实体和数据库中(这不是正确的位置),并且我不想从机器人实体内部访问我的全局配置对象(违反 OO)。但是,我也不能通过canProcess()接口方法传递它,因为这个变量只适用于那一种类型的机器人,而不适用于我系统中的所有其他类型的用户。因此,它在 UserInterface 中也没有位置。

那么,如何将此配置变量放入我的实体中?

4

2 回答 2

1

好吧,我只看到三种选择:

  1. 机器人实体是使用值创建的
  2. 该值在某个时间点传递到机器人实体
  3. 机器人实体获得值,很可能来自某种工厂或单例

我认为选项 3 将是最好的方法。

于 2012-05-15T14:34:08.023 回答
0

我通过使用postLoad事件处理程序解决了它。应用程序配置被传递给事件处理程序,并且在postLoad事件中我将配置设置注入到User需要它的适当实体中。

于 2012-05-21T06:31:49.970 回答