2011-12-16 49 views
1

我一直在使用下面的模式爲我的控制器操作的控制器進行通信:MVC - 應該如何服務層與

public ActionResult Create(CreateViewModel model) { 
    if(!ModelState.IsValid) { 
     return View(model); 
    } 

    var project = new Project { 
     Name = model.Name, 
     // ... 
    }; 

    projectRepository.Add(project); 

    return RedirectToAction("Index"); 
} 

這適用於簡單的場景,但我有以下幾種情況下的存儲庫是不足夠的。我創建了一個服務層/類來處理保存項目和任何額外的業務邏輯(而不是通過流暢的驗證或數據註釋的正常驗證)。

public class ProjectService : IProjectService { 

    void AddProject(Project project) { 
     // do business logic 
     // ... 

     repository.Add(project); 
    } 
} 

如何將我的業務層容易地與我的控制器進行通信?

這些都是類型的東西,我想傳達給控制器:

  • 業務邏輯/驗證錯誤
  • 數據庫故障(未能挽救等)

如何我這樣做不只是返回服務層的真/假或狀態代碼?

回答

1

如果您想在發生錯誤時返回詳細消息,則始終可以使用「例外」。也許用特定的細節定義你自己的特性,或者重用已經在.NET Framework中的特性。

如果這不是一個選項,你總是可以返回一個包裝類,它可以包含更詳細的錯誤信息並在Controller中處理。

2

如果選擇異常,請小心,這些代價很高。它也會爲您的控制器代碼提供額外的嵌套,具體取決於可能拋出的異常數量。你應該只爲異常情況拋出異常,而不是應用程序的正常流程處理的異常。

我會去與其他路由Wouter de Kort建議,使用消息對象的服務的返回類型。您可以使用簡單的枚舉鍵輸入返回消息對象,並使用服務可能遇到的各種情況。這些在控制器中看起來更好,因爲您可以使用開關/外殼而不是try/catch來處理枚舉。

更新

一個消息對象可能是什麼樣子:

public interface IServiceAbc 
{ 
    ServiceResponse InvokeMyService([params]); 
} 

public enum ResponseScenario 
{ 
    Success, 
    DatabaseFailed, 
    BusinessRuleViolated, 
    ValidationRuleViolated 
} 

public class ServiceResponse 
{ 
    public ResponseScenario Scenario { get; internal set; } 
    public string Message { get; internal set; } 
}