5

WCF サービスを公開する外部境界では、すべての内部例外を に変換しFaultExceptionます。これは手動のプロセスであり、多くの場合、各実装に固有の小さな欠陥があります。公開されているメソッドごとにコピー/貼り付けされ、無意識に変更されています (または忘れられています)。エラーを減らすために、未処理の例外をキャッチするアスペクトを作成したいと考えました。

内部例外をフォールト例外にマッピングします。マッピング関数をアスペクトに送信するにはどうすればよいですか?

次のようにプロパティをアスペクトに追加すると:

[Serializable]
public sealed class FaultExceptionConverter : OnExceptionAspect {
    public Func<Exception, FaultException> FaultConverter { get; set }
}

私は(属性の制限によって予想されるように)それを初期化することはできません([FaultExceptionConverter(FaultConverter = MyConversionMethod)]どこにMyConversionMethod割り当て可能なメソッドがありますFunc<Exception, FaultException>)。このタイプのパラメーターをアスペクトに渡すパターンはありますか? 多くのタイプをアスペクトに渡すことができます。これは一般的な問題ですか?

これを達成するためのより良い方法がたまたまある場合は、アドバイスをいただければ幸いです。

4

2 に答える 2

2

私はアスペクトの実装で同様の苛立たしい制限に遭遇しました。それらを回避するために私が使用したアプローチの 1 つは、アスペクトが実装されているクラスを何らかの「プロバイダー」タイプとして扱い、他のビットを要求するためにコールバックできるようにすることです。実行時に。

したがって、あなたの場合、次のような OnException オーバーライドを想像します。

public override void OnException(MethodExecutionArgs args)
{
    IFaultConverterProvider provider = args.Instance as IFaultConverterProvider;
    if (null != provider)
        Func<Exception, FaultException>exceptionConverterFunc = provider.GetFunc();
}

IFaultConverterProvider不足している追加のパラメーターを提供するために、属性付きの型で定義および実装するインターフェイスはどこにありますか。

次に、ちょっとした健全性チェックとして、アスペクトにコンパイル時の検証を導入して、アスペクトが適用される型が実際にこの必要なインターフェースを実装していることを確認できます。

public override bool CompileTimeValidate(Type type)
{
    if (!type.IsImplementationOf(typeof(IFaultConverterProvider )))
    {
        // The aspect must be in a type which implements IFaultConverterProvider 
        Message.Write(
            MessageLocation.Of(type),
            SeverityType.Error,
            "CUSTOM02",
            "Cannot apply [MyFaultExceptionAspect] to type {0} because it does not implement IFaultConverterProvider .", type);
            return false;
    }

    return true;
}
于 2012-12-12T20:46:19.227 に答える
0

残念ながら、属性に渡すことができるのは、bool、byte、char、short、int、long、float、double、string、Type、および列挙子のみです。

typeof(FaultConverterClass)回避策として、 Type および文字列として渡し、"MyConversionMethod"リフレクションを使用して変換メソッドを呼び出すことができます (もちろん、このメソッドが静的である場合のみ)。かなり「汚い」ように聞こえますが、メソッドが存在し、署名が必要であるというコンパイル時の検証を追加できます。

于 2012-12-12T20:41:03.777 に答える