2012-01-25 74 views
0

現在,我有一個沿着Models項目,Service項目,Utilities項目和幾個Datastores項目的ASP MVC Web應用程序,這些項目充當一個或多個域模型的存儲庫。我對每一層的分離感到非常滿意,但我堅持要從服務層返回到Web應用程序。什麼從服務返回到ASP MVC網絡應用程序?

例如,當用戶嘗試註冊時,控制器會收到一個RegisterViewModel。個別部分(電子郵件,密碼等)被髮送到服務層,該服務層使用guid,status,createdate等來構造成員域對象,將其發送到存儲庫以存儲並最終返回用於web應用的成員對象以重定向到/會員/ {GUID}。

但是,如果電子郵件已經存在,服務層應該如何通知Web應用程序?在更復雜的情況下,我可能需要檢查多個域對象和業務規則的存在/有效性,因此必須一次返回多個錯誤。另外,我不希望異常情況冒泡到Web層,因此服務層會捕獲所有異常,但需要通知Web層某些方面。

即使我找到一種方法來返回所有這些,Web層將負擔處理所有這些併爲用戶提供各種反饋。控制器代碼將是龐大的和錯誤修剪。演示文稿的服務結果是否有最佳做法?我應該消除單獨的服務層並將代碼放在控制器內部嗎?任何想法都歡迎。

回答

0

我寫的operation model庫用於這一目的,它允許你寫這樣的代碼:

public OperationResult Register(RegisterInput input) { 

    var errors = new ErrorBuilder(); 

    if (errors.NotValid(input) // Invoke DataAnnotations validation 
     || errors.Not(this.repo.FindUserByEmail(input.Email) == null, "Email '{0}' already exists.",() => input.Email)) 
     return errors; 

    // Do stuff 

    return HttpStatusCode.OK; 
} 

...並在控制器中的錯誤信息被複制到ModelState中:

[HttpPost] 
public ActionResult Register(RegisterInput input) { 

    var result = this.service.Register(input); 

    if (result.IsError) 
     return View().WithErrors(result); 

    // Do stuff 
} 

查看使用此模式編寫的MvcAccount項目的源代碼。

+0

感謝您的代碼。我可能會做這樣的事情,但也許爲每個服務電話定製結果。 –

0

首先,您需要決定是否爲分發目的而編寫服務層。

如果不打算服務層分發到不同的處理/機器,

  1. 創建消息類
  2. 創建消息類的數組,並將其存儲在 HttpContext.Items
  3. 現在在任何層中添加任何新的消息到該陣列
  4. 消耗它在視圖/控制器

HttpContext.Items可用於請求的生命週期,您可以一直使用它來查看。

如果您使用DI框架,則可以通過使用每個生命週期對象的請求來實現相同的目標。

如果你想分發對象沒有錯誤拋出你的服務層的異常。

+0

我不確定我希望我的服務層是否支持HttpContext,但您確實給了我以前沒想過的可能性。謝謝! –

+0

HttpContext.Items只是一個容器,一直存在於請求的生命週期中。正如我在帖子中提到的,你可以使用任何容器。如果沒有計劃分發系統,爲什麼不使用httpcontext? – chandmk

相關問題