私は非常に単純な3層プロジェクトを持っています。データストアと対話するDAL(データアクセスレイヤ)WCFサービスがあります。 DALサービスとクライアントUIとの間の仲介役としてのBLL(ビジネスロジックレイヤー)WCFサービス、およびWindowsフォームクライアントレイヤーです。中規模のサービスで強く型付けされたWCF FaultExceptionを返す
私は障害の契約として動作するように私のDALサービスでのDataContractを宣言:
[DataContract]
public class ValidationFault
{
[DataMember]
public String Message { get; set; }
[DataMember]
public String PropertyName { get; set; }
...
}
私のDALサービスがFaultContract属性で飾ら操作を持っています
[OperationContract]
[FaultContract(typeof(ValidationFault))]
Patient CreatePatient(Patient patient);
CreatePatientの実装はスロー次のような厳密な型のFaultExceptionが発生します。
throw new FaultException<ValidationFault>(new ValidationFault("Patient last name cannot be empty.", "LastName"));
BLLサービスは、DALサービスのクライアントとして機能し、UIレイヤのサービスとして機能します。私のBLLサービスでは、DALサービスのCreatePatientメソッドを呼び出します.FaultExceptionフォールトが発生した場合は、単にクライアントが処理するように再スローします。関連BLLコードは次のようになります。
...
catch (FaultException<ValidationFault>)
{
throw;
}
私はBLLに例外を検査することができますし、それは強く型付けされたFaultExceptionとそのままDALから渡された詳細セクションであることを確認することができます。例外を再現しようとしているBLLメソッドは、上記のDALメソッドと同じ[FaultContract]属性で修飾されています。
BLLサービスのクライアントであるUIクライアントは、例外を処理し、適切な情報を記録/表示しようとします。問題は、この障害がクライアントに到達すると、厳密に型指定されたFaultExceptionではなく、nullのDetailセクションを持つ一般的なFaultExceptionです。
catch (FaultException<ValidationFault> valEx)
{
throw new FaultException<ValidationFault>(new ValidationFault(valEx.Detail.Message, valEx.Detail.PropertyName));
}
それは強く型付けされたように、クライアントに到達した:I
はだけではなく、BLLの方法で障害を再スローで、私が代わりにこのように同じパラメータでそれを再作成する場合ことがわかりましたFaultExceptionは予期した通りです。
私の質問です:なぜこの例外をBLLサービスで再作成する必要がありますか? DALサービスによってスローされた厳密に型指定されたFaultExceptionを単に通過できないのはなぜですか?私は作業するコードを持っていますが、何が起こっているのか理解したいと思います。私はそれが顔の中で私を見つめているが、私の人生はそれを把握することはできません何かだと思う。