使用StructureMap进行AOP日志记录

时间:2012-12-06 14:24:05

标签: logging castle-windsor aop structuremap

我正在尝试使用StructureMap的AOP方法实现简单的日志记录。

基本上,我想在问题Castle, AOP and Logging in .NET中使用StructureMap进行处理。

CastleWindsor具有您可以实现的有用IInterceptor,然后控制何时使用IInvocation.Proceed()调用方法。允许您在调用方法之前和之后执行日志记录。

如何使用StructureMap实现这一目标?我已经厌倦了使用自定义Interceptor,但您获得的唯一句柄是创建实例时,而不是在实例上调用方法时。

1 个答案:

答案 0 :(得分: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);
    }
}

在SM配置中注册此内容以使用代理包装所有IFoo

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

所有IFoo实例上的任何方法的所有调用现在都会被LoggingInterceptor拦截。您当然可以通过检查实例来过滤要记录的调用。