3

我有一個服務程序集與多個服務類。每個班級分組一組相關的服務方法。這些服務使用IoC和構造函數注入器實例化。避免循環引用服務和DI

如果我有兩個服務類有時需要在另一箇中調用方法,那麼爲了避免循環引用,處理這些方法的最佳方法是什麼?

例如,假設從兩個不同的服務類兩種服務方法(不一定是最實際的例子,但爲了簡單起見):

public class UserService 
{ 
    public void RegisterUser(User user) 
    { 
     // Do a bunch of stuff needed to register a user 

     // Now call out to permission service to set up basic permissions 
     _permissionService.SetUpBasicPermissions(user); 
    } 
} 

public class PermissionService 
{ 
    public void GrantPermission(User user, int PermissionId) 
    { 
     // Add user permission to database 

     // Now call out to user service to do some other stuff on the user 
     _userService.TakeActionsOnUserAccount(user); 
    } 
} 

這裏是選擇我可以看到:

  1. 考慮到需要在這兩者之間共享功能,這是服務類應該合併到一個類中的一個標誌。但是,如果是這種情況,我最終是否會得到一個巨大的服務類?什麼決定了他們應該如何分手?

  2. 不要合併這兩個類,而是將共享邏輯的方法移動到它們自己的服務類中(將用戶和權限特定的邏輯留在其各自的類中)。如果是這種情況,我可能會得到幾個這樣的共享服務,我認爲這不是一件好事。

  3. 從一個服務到另一個服務所需的任何操作都應該移到調用代碼中。這對我來說似乎有問題,因爲我將刪除潛在的依賴邏輯,並使其成爲另一層的關注點。換句話說,在我調用_userService.RegisterUser()的地方,我現在總是必須在每次調用之後立即調用_permissionService.SetUpBasicPermissions()。

  4. 允許一個服務調用另一個服務,但不能同時調用其他服務。如果是這種情況,我選擇哪一個?我該怎麼做w /那個不能打另一個的邏輯呢?

  5. 使用委託將相關服務方法注入到被調用的服務方法中。 Bleh,這聽起來很難看。

這些是我能想到的,但我確信有一些我可以忽略。

想法?

在此先感謝。

+1

相關:http://stackoverflow.com/questions/1453128/is-there-a-good-proper-way-of-solving-the-dependency-injection-loop-problem-in-th – 2011-04-15 05:35:06

+1

相關:http ://stackoverflow.com/questions/2608875/bad-design-constructor-of-composition-uses-this – 2011-04-15 05:35:27

+1

相關:http://stackoverflow.com/questions/1356304/are-circular-class-dependencies-bad-from -a-coding-style-point-of-view – 2011-04-15 05:35:59

回答

1

如果你想擁有這兩種服務相互引用,你將需要使用屬性注入(或方法),而不是構造函數,以便他們能夠以前被傳遞到其他類完全建立。

只要有一個服務的設計在某些情況下調用另一個服務,只要操作的邏輯流程合理就可以了。雖然可能試圖將其保持在最低限度是一種更好的設計,因爲增加依賴性會增加耦合性,並且必須在單元測試中更緊密地映射行爲。

+0

我最終意識到我最大的依賴是我需要能夠從我的大部分服務中檢查權限,所以我把它解決了。我要儘量避免帶有循環引用。到目前爲止,我已經能夠不損害我的設計。 – 2011-04-28 19:57:31

2
  1. SRP原理states that every object should have a single responsibility所以合併類是不好的。
  2. 這就是發明的方式繼承方式,使用抽象類通用代碼並專門化後(不使用引用)
  3. 依賴邏輯不好,RegisterUser應該只做那個註冊,不給權限。將依賴關係移動到調用層是可以的。
  4. 只有在必須的情況下才能做到這一點,在您進行abstrat課程後應該清楚一點。儘管嘗試對象組合。
  5. 這就是所謂的容器,你應該瞭解它後,你讀好:http://www.potstuck.com/2009/01/08/php-dependency-injection

關於循環引用,OOP的原則,只能說避免抽象和具體類之間的循環引用(好萊塢原則),這是不是這樣。可以像你一樣使用它們。

但是,您正在使用非常好的依賴注入,因此您可以提取SetUpBasicPermissions並將它放在類之外。

objUser = new User(); 
objUserService.RegisterUser(objUser); 
objPermissionService.SetUpBasicPermissions(objUser);