1

StructureMapを使用したAOPアプローチで単純なロギングを実装しようとしています。

基本的に、私は、 Castle、AOP、およびStructureMapを使用した.NETでのロギングの質問で尋ねられたことを実行したいと思います。

CastleWindsorにはIInterceptor、メソッドが。で呼び出されるタイミングを実装して制御できるという便利な機能がありますIInvocation.Proceed()。メソッドの呼び出しが行われる前後にロギングを実行できるようにします。

StructureMapでこれをどのように達成できますか?カスタムを使用するのに疲れましたInterceptorが、取得する唯一のハンドルは、インスタンスでメソッドが呼び出されたときではなく、インスタンスが作成されたときです。

4

1 に答える 1

3

このようなものはおそらくあなたのために働くでしょう:

キャッスル プロキシ インターセプタを作成します。

public class LoggingInterceptor : IInterceptor
{
    private readonly IMyLogger _logger;
    public LoggingInterceptor(IMyLogger logger) { _logger = logger; }
    public void Intercept(IInvocation invocation)
    {
        _logger.Log("Before calling " + invocation.Method);
        invocation.Proceed();
        _logger.Log("After calling " + invocation.Method);
    }
}

IFooこれを SM 構成に登録して、すべてをプロキシでラップします。

var proxyGenerator = new ProxyGenerator();
c.For<IFoo>().Use<Foo>();
c.For<IFoo>()
    .EnrichAllWith(instance => 
        proxyGenerator.CreateInterfaceProxyWithTarget<IFoo>(instance, 
            new LoggingInterceptor(new MyLogger())));

のすべてのインスタンスの任意のメソッドへのすべての呼び出しは、IFooによってインターセプトされるようになりましたLoggingInterceptor。もちろん、インスタンスを調べることで、ログに記録する呼び出しをフィルタリングできます。

于 2012-12-10T10:56:16.363 に答える