我有一个使用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中也没有位置。
那么,如何将此配置变量放入我的实体?
答案 0 :(得分:1)
好吧,我只看到三个选择:
我认为选项3是最好的方式。
答案 1 :(得分:0)
我使用postLoad
事件处理程序解决了这个问题。应用程序配置传递给事件处理程序,在postLoad
事件中,我将配置设置注入需要它的相应User
实体中。