我正在尝试使用StructureMap的AOP方法实现简单的日志记录。
基本上,我想在问题Castle, AOP and Logging in .NET中使用StructureMap进行处理。
CastleWindsor具有您可以实现的有用IInterceptor
,然后控制何时使用IInvocation.Proceed()
调用方法。允许您在调用方法之前和之后执行日志记录。
如何使用StructureMap实现这一目标?我已经厌倦了使用自定义Interceptor
,但您获得的唯一句柄是创建实例时,而不是在实例上调用方法时。
答案 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
拦截。您当然可以通过检查实例来过滤要记录的调用。