さて、私はこれと文脈の質問に名前を付けるつもりでしたが、どうやら質問という言葉はタイトルでは許可されていません.
とにかく、ここに問題がIErrorHandler
あります。すべてのサービス コードを乱雑にすることなくログを提供するために、WCF サービスで使用しています。これまでのところ、これはうまく機能しています。ただし、完全に非同期のサービスに移行しようとしている今call stack
、因果連鎖ではなくリターン スタックであるという問題に直面しています。
ここで、Stephen Cleary の論理呼び出しコンテキスト MyStackNinject
をのIntercept
拡張機能と組み合わせて使用してみました。
注入する:
Bind<IThing>().To<Thing>()
.Intercept()
.With<SimpleContextGenerator>();
SimpleContextGenerator:
public class SimpleContextGenerator : IInterceptor
{
public void Intercept(IInvocation invocation)
{
using (MyStack.Push(
string.Join(".",
invocation.Request.Method.DeclaringType.FullName,
invocation.Request.Method.Name)))
{
invocation.Proceed();
}
}
}
ただし、問題は 2 つあります。1)using
エラーが実際にスローされる前に が完了し、2) に到達するまでにコンテキスト全体がクリアされるため、1 も問題ではありませんIErrorHandler
。のコードPop
をコメントアウトできます。MyStack
CurrentContext.IsEmpty
true
ProvideFault
IErrorHandler
したがって、私の質問も2部構成です。
IErrorHandler
1)呼び出しまでコンテキストを維持する方法はありますか?
2)そうでない場合、コンテキストにアクセスできるグローバル規模でエラーをログに記録する別の方法はありますか?
.NET 4.5、Ninject 3.2、および DynamicProxy 3.2 を使用しています。
正直なところ、例外がどこでスローされたかを知っているだけでうれしいです。現在のクラスとメソッドで十分です。フルスタックは必要ありません。
編集:OperationContext
を使用してに配置するとIExtension<>
、 に到達するまで保持できIErrorHandler
ます。ただし、メソッドがいつ終了するかはまだわからないため、どこで例外が発生したかはわかりません。