2012-03-08 21 views
2

私はPostsharpでNLogを使ってプロジェクトをまとめています。 OnMethodBoundaryAspect属性の下位クラスを使用して、クラスを装飾し、ロギングのインターセプトされた実行を提供します。私のDIコンテナはUnityです。依存関係注入を使ってポストシャープからログ依存関係を解決する方法

したがって、DIを単独で(ServiceLocatorではなく)使用すると、ログを提供するためにアスペクトクラス内のLogオブジェクトをどのように解決できますか?過去に私はServiceLocatorを使ってログオブジェクトを解決しましたが、ServiceLocatorが本当にアンチパターンであると本当に信じ始めているので、私はそれから離れようとしています(はい、私は少し聖なるこの問題に関する戦争)。

ありがとうございます!

+0

アップデート - NLogをラップしてSystem.Diagnostic.Trace.Listenersに追加するカスタムTraceListenerを作成することを検討しています。それで、その側面では、私はただそれに書き込むことができます。 – lstutzman

+0

DIと容器は、AOPを行うための強固な方法を提供します。システムを正しくモデリングすると、ロギングを含むデコレータを簡単に設定できます。あるいは、そうでなくても、Unityを使ってロギングを有効にするための傍受を行うことができます。 PostSharpがまだ必要だと思うのはなぜですか? – Steven

+0

私は以前に統一の傍受を使用していましたが、パフォーマンスのオーバーヘッドを処理できませんでした。私はポストシャープを使用しています。なぜなら、すべてのデコレータ配管コードを書かなくて済むからです。振り返ってみると、Ambient Contextパターンを使ってappdomain全体でロギングを利用できるようになるでしょう。 – lstutzman

答えて

1

public class LogAspect : OnMethodBoundaryAspect 
{ 
    /// <summary> 
    /// Gets or sets the logger. 
    /// </summary> 
    public static ILogger logger { get; set; } 

あなたのクラスの態様では、あなたのILoggerですクラスでアプリケーションのinitメソッドで設定されたロガーの変数を静的プロパティロガーを追加し、AttributeExcludeで、この初期化の前に、すべてのメソッドを除外する。

[LogAspect(AttributeExclude = true)] 
    protected void Application_Start() 
    { 
     _windsorContainer = new WindsorContainer(); 
     ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer); 
     LogAspect.logger = _windsorContainer.Resolve<ILogger>(); 
関連する問題