2012-05-15 79 views
1

我有一個使用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中也沒有位置。

那麼,我該如何獲得這個配置變量到我的實體?

回答

0

我通過使用postLoad事件處理程序解決了這個問題。應用程序配置被傳遞給事件處理程序,並且在postLoad事件中,我將配置設置注入相應的需要它的User實體中。

1

好吧,我只看到三個選擇:

  1. 機器人實體與
  2. 值在時間傳遞到機器人實體在某個點的值創建
  3. 機器人實體獲得價值,最有可能從某種工廠或Singleton

我會認爲選項3將是最好的方式去。

+0

我與選項2 –