如何将Logging拦截器注入Windsor Controller Factory?

时间:2012-11-08 22:55:29

标签: castle-windsor castle-dynamicproxy

如何使用流畅配置将异常或记录拦截器添加到Windsor Controller Factory?

在我的bootstrapper容器中,我新建了我的安装程序以传递诸如assemblyName之类的值。

在我的ControllerInstaller中,我这样做,我认为这是错误的,为什么它不起作用:

container.Register(
    Classes
        .FromAssemblyNamed(_assemblyName)
        .BasedOn<IController>()
        .LifestyleTransient(),
    Component
        .For<IController>()
        .ImplementedBy<Controller>()
        .Interceptors(InterceptorReference.ForType<LoggingAspect>())
        .Anywhere);

在我的loggingAspect安装程序中,我这样做:

container.Register(
    Component
        .For<IInterceptor>()
        .ImplementedBy<LoggingAspect>());

3 个答案:

答案 0 :(得分:4)

我认为这应该有用......

_container.Register(
    Classes
        .FromAssemblyNamed(_assemblyName)
        .BasedOn<IController>()
        .LifestyleTransient()
        .Configure(component => component.Interceptors<LoggingAspect>()));

答案 1 :(得分:2)

这是一篇关于创建自定义Windsor控制器工厂的好文章 ASP.NET MVC with Windsor – programmatic controller registration

以下是如何使用流畅配置注册拦截器的示例。

把两者放在一起应该很容易。您只需将.Interceptors<MyLoggingInterceptor>()行添加到windsor控制器工厂的注册和/或控制器的注册。

container.Register(
    Component
        .For<IInterceptor>()
        .ImplementedBy<MyLoggingInterceptor>(),
    Component
        .For<IInterceptor>()
        .ImplementedBy<MyArgumentInterceptor>(),
    Component
        .For<IDoStuff>()
        .ImplementedBy<DoStuff>()
        .Interceptors<MyLoggingInterceptor>()
        .Interceptors<MyArgumentInterceptor>());

答案 2 :(得分:0)

另一种方法:

container.Register(
    Component.For<IInterceptor>()
        .ImplementedBy<ExceptionHandlerInterceptor>()
        .LifeStyle.Is(LifestyleType.Transient)
        .Named("ExceptionHandlerInterceptor"),
    Component.For<IController>()
        .ImplementedBy<Controller>()
        .LifeStyle.Is(LifestyleType.Transient)
        .Interceptors("ExceptionHandlerInterceptor"));