2016-03-21 64 views
0

作爲最佳實踐,如何執行所有實現以特定方式處理異常。例如,假設我有以下界面如何執行抽象以實現某種特定方式

public interface IApplicationProvider<TData> : IDisposable{ 
    TData Get(string appName); 
} 

public abstract ApplicationProviderBase<MyDTO> { 
    public abstract MyDTO Get(string appName); 
} 

public class SomeApplicationProvider: ApplicationProviderBase { 
    public MyDTO Get(string appName){ 
     ... 
     if (somecondition == somecondition) 
      throw new InvalidOperation("Application could not be fetched due to a custom error"); 
    } 
} 

在UI中它將處理所有「InvalidOperations」並將消息顯示回給用戶。但是,另一種方法是創建一個將包裝數據和任何錯誤消息的自定義對象。

public OperationObject Get(string appName){ 
     var operationObject = new OperationObject(); 

     if (somecondition == somecondition) 
      operationObject.ErrorMessage = "message"; 
     else 
      operationObject.Data = MyDTO 
    } 

編輯:基本上我想要一種方式讓所有提供者提供操作失敗的原因。

回答

1

我過去處理這種情況的一種方式是利用簡單的操作結果類。基本上你所做的就是將你的成功和失敗包裝在一個持有操作狀態的對象,它返回的任何數據,或者一條描述發生的事情的消息中。下面是一個示例

public enum OperationStatus { Success, Failure, Pending } 
public class OperationResult<T> 
{ 

    public T Data { get; private set; } 
    private OperationStatus opStatus; 

    public string Status 
    { 
     get 
     { 
      return this.opStatus.ToString(); 
     } 

     private set 
     { 
      var names = Enum.GetNames(typeof(OperationStatus)); 
      if (names.Contains(value)) 
      { 
       this.opStatus = (OperationStatus)Enum.Parse(typeof(OperationStatus), value); 
      } 
      else 
      { 
       throw new Exception("Illegal Status Type"); 
      } 
     } 
    } 

    public string Message { get; private set; } 

    public bool IsSuccess 
    { 
     get 
     { 
      return this.Status == OperationStatus.Success.ToString(); 
     } 
    } 

    public OperationResult(OperationStatus status, string message, T data) 
    { 
     this.Data = data; 
     this.Status = status.ToString(); 
     this.Message = message; 
    } 

    public static implicit operator bool(OperationResult<T> result) 
    { 
     return result.IsSuccess; 
    } 
} 

我將把你的博客貼子,討論方法的反應http://www.appvnext.com/blog/2015/12/10/outcome-basics-part-i類似的技術。

使用這樣的技術將爲您的提供者提供一個約定來傳達任何異常和成功。

+0

我已經實現了這種方法,並感謝博客文章。 –