2013-04-08 69 views
3

我想知道的最佳做法或返回從服務層,它會驗證結果的任何建議,在ASP.NET MVC中使用。服務層 - 返回驗證和功能效果

選項1個

public IEnumberable<ValidationResult> Foo(int userId, out videoId) 
{ 
    var validationResults = new List<ValidationResult>(); 

    // Validation logic goes here... 

    videoId = _videoService.AddVideo(); 

    return validationResults; 
} 

選項2

public ServiceResult Foo(int userId) 
{ 
    var validationResults = new List<ValidationResult>(); 
    var serviceResult = new ServiceResult(); 

    // Validation logic goes here... 

    serviceResult.ReturnObject = _videoService.AddVideo(); 
    serviceResult.ValidationResults = validationResults; 
    return serviceResult; 
} 

public class ServiceResult 
{ 
    public IEnumberable<ValidationResult> ValidationResults { get; set; } 
    public object ReturnObject { get; set; } 
} 

目前我在做選擇1,因爲我覺得拳擊和未拳擊在選項2可能是一個痛點。有任何想法嗎?

回答

3

如果從服務層返回object,則必須在客戶端代碼中投入returnobject合適的類型/值。因此,如果你不小心的話,類型檢查會導致運行時錯誤導致invalidcastexceptions。更重要的是,這是一個不雅的解決方案,會污染你的代碼,從而降低代碼的可讀性。

如果你想只有一種類型,你可以使用泛型:

public class ServiceResult<T> 
{ 
    public IEnumberable<ValidationResult> ValidationResults { get; set; } 
    public T ResultObject 
    { 
     get;set; 
    } 
} 

如果你不喜歡這種解決方案,你可以定義每個服務方法的結果類型類型。

public class ResultBase 
{ 
    public IEnumerable<ValidationResult> ValidationResults { get; set; } 

} 
public class RegisterResult : ResultBase 
{ 
    public Video Video{get;set;} 
} 
+0

我落得這樣做ServiceResult Ryan 2013-04-09 00:55:08

+1

@Ryan的代碼是嚴重的錯誤,但我認爲你有這個想法。我已經修好了,你應該再檢查一遍。 – boran 2013-04-09 08:37:30

0

我會選擇去2.它看起來更乾淨。使用選項2,您的服務就像調用代碼的黑盒子一樣。 它可以讓你改變UI層而不影響服務層。

不應該在ServiceResult類屬性「返回object」被稱爲「結果」?或在方法Foo中,它應該是serviceResult.ReturnObject = _videoService.AddVideo();

+0

是的,你說得對,我返回object。我解決了這個問題,但是我仍然需要在這個類型的調用層中轉換爲我需要的任何類型,這將是一個int類型。你也可以擴展我改變影響服務層的UI層嗎? – Ryan 2013-04-09 00:12:24