2011-09-02 11 views
1

私は単純なログサービスを持つ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のコンストラクタに追加することです。しかし:

現在
  1. 私はControllerBaseでコンストラクタを持っていない、
  2. Iてるビット コントローラでDIコンテナを参照するの 値を否定、コントローラの分離を壊すことを心配私はコントローラのみ パラメータのないコンストラクタを持つことができます(m個の間違った「の場合、私はそれを理解 として、plsは私を修正)ので、私は、ControllerBaseのコンストラクタにして ロガーを渡すことができるとは思わないで始まり、そして
  3. するDIしたがって、 に何かを渡す方法はありません。

すべてのコントローラでサービスを利用できるようにするには、どのような場所が必要ですか?

答えて

3

コンストラクタに配置します。 BaseControllerに配置することもできます。

理想的には、依存性注入を使用してコントローラーに入れます。コントローラには、IoCコンテナがサポートしている場合はパラメータがあります。

private readonly ILogService logService; 
public MyController(ILogService logService) 
{ 
    this.logService = logService; 
} 
+0

これはうまくいきました。空は私の頭に落ちていませんでした。ありがとうございました - 私はパラメータのないコンストラクタに関するこれらの議論をすべて見てきましたが、これはDIコンテナではなくMVCフレームワークの限界だと考えました。 – Val

1

私はあなただけで散発的にそれを使用するかのように聞こえることを唯一の理由のためにベースコントローラにそれを追加しないでしょう。 Daniel Whiteがコントローラーのコンストラクターに示唆しているように、私はそれを追加します。ほとんどのコントローラーで使用しているかのように見える場合は、ベースに移動することを検討します。