我有一個使用Doctrine ORM實體的應用程序。遵循OO設計,我嘗試儘可能多地將業務邏輯推入實體中。但是我遇到了一個小問題。某些業務邏輯需要在我的外部應用程序配置中定義的變量(因爲它們有時需要進行調整)。如何在不違反OO原則的情況下將這些內容加入到我的實體中?我不想直接從我的實體訪問我的全局配置,我也不想將這些變量存儲在我的實體和數據庫中。將應用程序配置設置傳遞給實體
這裏是一個模式的具體例子。我使用PHP和Doctrine ORM,但是同樣的OO原則適用於Hibernate(JAVA),nHibernate(C#)等。
我的應用程序有產品和用戶。有許多不同類型的用戶(真正的人類用戶,自動機器人等等)。他們都需要在產品對象上工作。所有用戶共享其有一個方法相同的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 –