我有一个将 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 中也没有位置。
那么,如何将此配置变量放入我的实体中?