【问题标题】:AOP Logging with StructureMap使用 StructureMap 进行 AOP 日志记录
【发布时间】:2012-12-10 23:44:44
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: logging castle-windsor aop structuremap


    【解决方案1】:

    这样的事情可能对你有用:

    创建城堡代理拦截器:

    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 拦截。您当然可以通过检查实例来过滤要记录的调用。

    【讨论】:

    • 但如果我必须注册所有接口?如何在不明确指定所有类型的情况下执行此操作?
    猜你喜欢
    • 2012-11-04
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多