2013-05-10 65 views
1

我使用的是控制器 - 服務 - 庫層圖案我爲我的應用。存儲庫包含基本的CRUD操作和服務層所有業務邏輯,而控制器保持非常精簡(他們只調用服務層功能)。MVC 4通知消息給用戶

我想發送消息(成功,警告等)給用戶,但我不確定如何做到這一點從服務層級別?我查找了一些使用TempData和基類的解決方案,但這些解決方案似乎只能在控制器級別上運行。

是否有一個很好的解決方案來推動用戶通知從服務層的圖?

回答

2

看起來你在你的應用程序架構的關注良好的分離。以這種方式保持它是非常明智的 - 不要讓你的服務層知道關於UI的任何信息。

我會做我會創造一些類服務層返回的執行結果。

public class ExecutionResult<T> 
{ 
    public T Result { get; set; } 
    public string Message { get; set; } 
} 

這種方式,您可以通過MessageViewBag.UserNotification和shouw它在你的觀點:

編輯:示例用法:

public class Math 
{ 
    public ExecutionResult<double> Divide(double number, double divideBy) 
    { 
     if (divideBy == 0) 
     { 
      return new ExecutionResult<double> 
       { 
        Result = double.NaN, 
        Message = "Division by zero is not possible" 
       }; 
     } 

     return new ExecutionResult<double> 
      { 
       Result = number/divideBy 
      }; 
    } 
} 

這僅僅是一個樣品。在現實世界裏,你會採取不同的方法,comparing values of type double

+0

感謝您的想法,請給我一個例子,我將如何使用這種方法在服務層級的功能? – stare 2013-05-10 06:41:55

+0

我很想看到這是如何實現.. – 2013-12-11 21:31:42

+0

有關如何使用此方法的示例,請參見實體框架是如何使用DbEntityValidationResult這裏:http://msdn.microsoft.com/en-us/library/system.data。 entity.validation.dbentityvalidationresult(v = vs.113)的.aspx – DarrellNorton 2014-05-03 15:34:46

0

有了那種模式,你不想直接從業務層的意見交流,所以你可能會考慮將一些自定義的數據傳輸對象到控制器上的每個方法調用。這些DTO可能包含任何錯誤消息或通知。然後控制器可以將這些數據傳遞給視圖。

+0

謝謝您的回答,但我怎麼會設法表現出'返回RedirectToAction(「指數」,「事件」)後的消息'打電話? – stare 2013-05-10 05:59:23

+0

RedirectToAction具有接受「routeValues」的重載。這些可以是您想要的任何數據,在這種情況下是您的自定義DTO。 – dChimento 2013-05-10 06:02:54

0

一種方式是爲您服務方法返回布爾值,以指示成功或失敗。控制器會知道這一點,並可以採取相應的行動。

另一種方式可能是方法返回一個包含關於在服務發生了什麼信息定製的「錯誤」的對象。