1

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

基本上,我想做Castle, AOP and Logging in .NET with StructureMap这个问题中提出的问题。

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 回答