首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Castle Windsor 3.0截取可启动工具调用的方法

使用Castle Windsor 3.0截取可启动工具调用的方法
EN

Stack Overflow用户
提问于 2012-01-05 07:20:57
回答 1查看 580关注 0票数 3

我用的是Castle Windsor 3.0

我有一个应该在注册阶段后自动启动的组件。我还想截获来自它的Start/Stop方法的异常,并记录它们的详细信息。

为了使我的组件可启动,我使用了Windsor附带的startable工具:

代码语言:javascript
复制
container.AddFacility<StartableFacility>(f => f.DeferredStart());

我创建了一个自定义拦截器,如下所示:

代码语言:javascript
复制
class ExceptionLoggerInterceptor : IInterceptor
{
    IExceptionLogger m_ExceptionLogger;

    public ExceptionLoggerInterceptor(IExceptionLogger exceptionLogger)
    {
        if (exceptionLogger == null)
            throw new ArgumentNullException("exceptionLogger");

        m_ExceptionLogger = exceptionLogger;
    }

    public void Intercept(IInvocation invocation)
    {
        try
        {
            invocation.Proceed();
        }
        catch (Exception ex)
        {
            m_ExceptionLogger.Write(ex, invocation.Method.Name, invocation.TargetType.Name);
        }
    }
}

我像这样注册了这个组件:

代码语言:javascript
复制
Component.For<IExceptionLogger>()
 .ImplementedBy<EnterpriseLibraryExceptionLogger>()
 .LifeStyle.Singleton,

Component.For<ExceptionLoggerInterceptor>()
 .LifeStyle.Singleton,

Component.For<IWorkflowService>()
 .ImplementedBy<WorkflowService>()
 .LifeStyle.Singleton
 .StartUsingMethod(c => c.Start)
 .StopUsingMethod(c => c.Stop)
 .Interceptors(InterceptorReference.ForType<ExceptionLoggerInterceptor>()).Anywhere

为了进行测试,我编写了一个脏的

代码语言:javascript
复制
throw new Exception(); 

在组件的Start方法的实现中。在注册阶段,当Windsor自动调用组件上的Start方法时,会抛出异常,但不会被我的自定义拦截器截获。

我进行了另一个测试,这次没有使用Startable工具,而是手动调用Start方法。异常被抛出,并被我的自定义拦截器截获。

那么,正如这篇文章的标题所问的,有没有一种方法可以拦截Windsor的Startable工具调用的方法?

问候

路易-皮埃尔-博蒙特

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-10 04:12:20

我将部分回答我自己的问题:

在使用Startable工具时,我找不到任何方法来拦截组件上的Start方法。看起来该工具并没有使用为对象创建的代理来执行调用,而是使用对象本身。

一篇专门的帖子介绍了here的问题。

无论如何,我很清楚地发现使用代理对象进行AOP是有其局限性的。这就是我转而使用SheepAspect的原因,它是一个IL编织AOP框架。

我将SheepAspect与Castle Windsor混合在一起,现在,当我的组件的Start方法被Castle Startable工具调用时,我的所有方面也都被调用了!

下面是我如何用SheepAspect编写我的ExceptionAspect:

代码语言:javascript
复制
[SingletonAspect]
public class ExceptionAspect
{
    IExceptionLogger m_ExceptionLogger;

    public ExceptionAspect(IExceptionLogger exceptionLogger)
    {
        if (exceptionLogger == null)
            throw new ArgumentNullException("exceptionLogger");

        m_ExceptionLogger = exceptionLogger;
    }

    [SelectTypes(typeof(WorkflowService))]
    void Targets() { }

    [Around("Execute")]
    [SelectMethods("Name:('Start') & InType:@Targets")]
    public void Execute(MethodJointPoint jp)
    {
        object result = null;

        try
        {
            result = jp.Execute();
        }
        catch (Exception ex)
        {
            m_ExceptionLogger.Write(ex, jp.Method.Name, jp.Method.ReflectedType.Name);
        }

        return result;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8735534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档