2015-04-07 43 views
1

那麼,當我在觀看SOLID視頻時,我想到了這一點。 單一責任原則說「一個班級應該只有一個責任」。服務層類是否違反SRP原則?

這很好。但同時,我正在ASP.NET MVC 5項目中構建N層模型。我們有UI層,存儲庫層,域層和要公開的服務層。在服務層上,我們基本上每個類(UserServiceCompanyService等)有一個類。 UserService類有一個負責處理User操作的責任,但另一方面,它具有許多不同的責任,如身份驗證和處理該用戶/公司關係。這是否違反SRP原則?

回答

3

當然。事實上,該類的代碼行數必須非常大,這是代碼異味的明確指示。

當你談到單一責任時,你應該考慮改變原因。爲什麼我的代碼可以改變?在你舉的例子中,我可以想到幾個原因:我決定改變auth系統,我的數據庫的工作方式,我做驗證的方式......所有這些都是使不同類的結果的線索AuthServiceUserValidatorUsersRepository ......

當你描述我們的類做什麼,你所使用的「和」字:「如身份驗證和處理用戶/公司的關係」。這是你班級的另一個症狀是做得太多。如果你不能使用「and」來描述課程,你可能違反了原則

雖然你堅信這些改變的可能性不會發生,因爲系統總是很好,但它很好地劃分了代碼因爲你會使代碼更好地組織和測試。

5

只有在您將將所有多重責任實施放入以內時,它纔會違反SRP。在SRP中,一個班級可以有唯一的責任。管理用戶操作是一項責任,但也可以分解爲子責任,例如authorization,company relation等。

每個子責任都可以作爲每個分離的類來實現。然後,您的UserService將使用這些子類作爲aggregate services。例如:

public class UserService{ 
    public UserAuthorizationService UserAuthorizationService = new UserAuthorizationService(); 
    public UserCompanyRelationService UserCompanyRelationService = new 
UserCompanyRelationService(); 

    public bool IsAuthorized(){ 
     // use UserAuthorizationService 
    } 
    public // whatever you do with UserCompanyRelationService 
} 
+0

用戶服務將是門面,所以。 – gog

+1

所以它不會破壞SRP規則... – Fendy

相關問題