将应用程序配置设置传递给实体

时间:2012-05-15 13:35:00

标签: php oop design-patterns doctrine

我有一个使用Doctrine ORM实体的应用程序。在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中也没有位置。

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

2 个答案:

答案 0 :(得分:1)

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

  1. 使用值
  2. 创建机器人实体
  3. 该值会在某个时间点传递到机器人实体
  4. 机器人实体获取的值很可能来自某种工厂或单身人士
  5. 我认为选项3是最好的方式。

答案 1 :(得分:0)

我使用postLoad事件处理程序解决了这个问题。应用程序配置传递给事件处理程序,在postLoad事件中,我将配置设置注入需要它的相应User实体中。