私は単純なログサービスを持つMVC3アプリを持っています。すべてのサービスは、MicrosoftのUnity Dependency Injectionコンテナを使用して呼び出されます。MVC3:ロガークラスに依存関係を追加する適切な場所?
ほとんどの方法について、私は例外を無視します。彼らはトップレベルのエラーハンドラで捕まえられ、それらを分類し、それらをログに記録するかどうかを決定し、私が望むHTTPレスポンスを生成し、エラーコントローラでアクションメソッドを呼び出して私のカスチムエラーページを返します。
時には、私はそれをしたくありません。例外が発生した場所で例外を処理したい私のコントローラで。その場合は、適切なデフォルト値を代入してコントローラのロジックを続行する前にエラーをログに記録します。私のコントローラでは、私が追加:
var logService = DependencyResolver.Current.GetService<ILogService>();
try { /* something indeterminate */ }
catch (Exception ex) {
logService.LogException(category, ex);
/* do something else instead */
}
は、今私は(それが起こると後で同じ方法で、)それをそのコントローラで二回目をやりたい
私は1つの場所であることでした。私がこれをやり直すと、私は自分自身を繰り返すので、リファクタリングする時が来たと思う。
マイロガーを自分のコントローラーで使用できるようにするにはどうすればよいですか?私のコントローラはすべてカスタムのControllerBaseを継承しています。私の最初の考えは、それをControllerBaseのコンストラクタに追加することです。しかし:
現在- 私はControllerBaseでコンストラクタを持っていない、
- Iてるビット コントローラでDIコンテナを参照するの 値を否定、コントローラの分離を壊すことを心配私はコントローラのみ パラメータのないコンストラクタを持つことができます(m個の間違った「の場合、私はそれを理解 として、plsは私を修正)ので、私は、ControllerBaseのコンストラクタにして ロガーを渡すことができるとは思わないで始まり、そして
- するDIしたがって、 に何かを渡す方法はありません。
すべてのコントローラでサービスを利用できるようにするには、どのような場所が必要ですか?
これはうまくいきました。空は私の頭に落ちていませんでした。ありがとうございました - 私はパラメータのないコンストラクタに関するこれらの議論をすべて見てきましたが、これはDIコンテナではなくMVCフレームワークの限界だと考えました。 – Val