2014-01-22 51 views
1

我有下列層的Web應用程序:瞭解SRP原則與nlayers

  1. 查看
  2. 業務
  3. 實體

我想送一當用戶註冊時向用戶發送電子郵件。

我有類User,Entities層以及業務層中的UserBussines和MailBusiness類。

問題是我不知道將電子郵件發送到用戶的正確位置。

我看到一些選項

1)控制器:

UserBusiness.AddUser(); 
MailBusiness.SendEmail(); 

2)在商家

UserBusiness.AddUserAndSendEmail() 
{ 
    AddUser(); 
    MailBusiness.SendEmail(); 
} 

在兩個選擇我認爲我沒有履行SRP採用SOLID原則,因爲我在一種方法中承擔了兩項責任。

我不理解原理?或者我做錯了什麼?

回答

0

您具有用戶註冊情形:

Given not registered user 
When user registers 
Then user becomes registered 
And greeting mail is sent 

這種情況應該在你的業務邏輯層存在的,因爲:

  • 這是
  • 應該存在是否您的業務領域的場景使用Web應用程序,桌面應用程序或移動應用程序。

所以,你應該有一些應用服務(如UserService),這將作爲協調員,用戶庫和電子郵件服務:

public void RegisterUser(User user) 
{ 
    // possibly you should also check that user is not registered yet 
    _userRepository.Add(user); 
    _emailService.SendGreeting(user); 
} 
+0

所以,你告訴我,我必須把它放在用戶業務邏輯?或者我必須創建另一個班級?我認爲我可以使用UserBusiness類作爲應用程序服務。 但是,dosen't RegisterUser有兩個resonsabilities?添加用戶在數據庫併發送電子郵件?它打破了SRP原則?或者我沒有失去某種東西? –

+0

@AlbertCortada如果你已經有類名的約定,那麼保持它爲'UserBusiness',但不要將方法命名爲'AddUserAndSendEmail',因爲它說明如何實現方法而不是使用什麼方法。將其命名爲'RegisterUser' - 那個方法真的有什麼 –

+0

@AlbertCortada關於責任 - 你的方法有單一責任 - 執行用戶註冊場景。考慮你正在添加日誌記錄。你會命名這個方法'AddUserIfNotExistsAndSendEmailAndLogResults'嗎?類可以協調其他類的工作 –