2016-07-05 14 views
0

Web APIでカスタム例外を変換するためにASP.NET BoilerplateのカスタムIExceptionToErrorInfoConverterを実装しました。ABPフレームワークの例外変換におけるErrorInfoの制限を克服する

ErrorInfo Convert(Exception exception); 

問題私は自分のエラーDTOを持っていると思いますので、ErrorInfo構造は私の要件に適合していないということです。

問題は、ABPがErrorInfo型を返す必要がありますが、厳密なインターフェースを持っているということです。

誰でもABP例外変換を回避する方法はありますか?

答えて

1

あなたは1つのトリックを試すことができます。 Abpがjsonレスポンスを作成するときに、すべての利用可能なプロパティをリフレクションで受け取り、ErrorInfoから派生し、IExceptionToErrorInfoConverterに置き換えて独自のクラスを作成しようとすることができる、つまりMvcAjaxResponseオブジェクトにラップします。実装:

[Serializable] 
public class MyErrorInfo : ErrorInfo 
{ 
    public string MyProperty1 { get; set; } 
    public int MyProperty2 { get; set; } 
} 

public class MyExceptionToErrorInfoConverter : IExceptionToErrorInfoConverter 
{ 
    public IExceptionToErrorInfoConverter Next { set { } }   

    public ErrorInfo Convert(Exception exception) 
    { 
     return new MyErrorInfo{ MyProperty1 = "test", MyProperty2 = 1}; 
    } 
} 
0

これは私の補足情報は、@スラヴァ-utesinov accepted answer (in this QA)のおかげです。

実際には内部的にABPはDTOのシリアル化を扱うときにobjectを使用すると思われますので、前提は確実です。

ABPソースからいくつかのサンプルコード:

public static string ToJsonString(this object obj, bool camelCase = false, bool indented = false) 
{ ... } 

protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior) 
{ ... } 

だから成功した後、私は試してみると隠すオリジナルのErrorInfoメンバーに問題を強化しました。今、ABPがJson.NETを使用していることを知り、私はConditional Property Serializationの機能を発見しました。通常、bool ShouldSerialize[member name]()を実装することで、シリアライザにプロパティを無視するように指示できます。

だから私は、コンセプトコードの次の証明になってしまった:

public class ErrorInfoEx : ErrorInfo 
{ 
    public new string Details { get; set; } 
    public bool ShouldSerializeDetails() { return false; } 

    public ErrorInfoEx(int code, string message) : base(code, message) { } 
    public string MyField { get; set; } 
} 

嘆願を使用すると、基本クラスのメンバを無視するように、基本クラスの実装を置き換える必要がありますいくつかの理由で、注意してください。

JSONの結果として、「詳細」プロパティは表示されませんが、「myField」が存在します。

{ 
    "success":false, 
    "result":null, 
    "error": 
     { 
      "myField":"123", 

      "code":420, 
      "message":"Validation failed", 
      "validationErrors": 
       [{ 
        "message":"'Order Number' should not be empty.", 
        "members":["OrderNumber"] 
       }] 
     }, 
     "unAuthorizedRequest":false 
} 
関連する問題