代码之家  ›  专栏  ›  技术社区  ›  jonnii

具有Fluent接口的Castle拦截器

  •  1
  • jonnii  · 技术社区  · 15 年前

    我试图让我编写的拦截器工作,但由于某些原因,当我请求我的组件时,它似乎没有实例化拦截器。我正在做这样的事情(请原谅我,如果这不是很好的编译,但你应该明白):

    container.Register(
        Component.For<MyInterceptor>().LifeStyle.Transient,
        AllTypes.Pick().FromAssembly(...).If(t => typeof(IView).IsAssignableFrom(t)).
        Configure(c => c.LifeStyle.Is(LifestyleType.Transient).Named(...).
                       Interceptors(new InterceptorReference(typeof(MyInterceptor)).
        WithService.FromInterface(typeof(IView)));
    

    我在拦截器的构造函数中放置了断点,它似乎根本没有实例化它。

    在过去,我使用XML配置注册了拦截器,但我热衷于使用fluent接口。

    任何帮助都将不胜感激!

    1 回复  |  直到 15 年前
        1
  •  6
  •   Mauricio Scheffer    15 年前

    我认为你误用了 WithService.FromInterface

    使用实现查找子对象 界面例如:如果你有 iSeries设备和IPProductService: 网络接口, 其他接口。当你打电话的时候 将使用IPProductService。有用的 当你想注册的时候 全部的 你的 服务,但不希望指定

    你也错过了机会 InterceptorGroup Anywhere . 这是一个工作示例,我尽可能少地更改了您的示例以使其工作:

    [TestFixture]
    public class PPTests {
        public interface IFoo {
            void Do();
        }
    
        public class Foo : IFoo {
            public void Do() {}
        }
    
        public class MyInterceptor : IInterceptor {
            public void Intercept(IInvocation invocation) {
                Console.WriteLine("intercepted");
            }
        }
    
        [Test]
        public void Interceptor() {
            var container = new WindsorContainer();
    
            container.Register(
                Component.For<MyInterceptor>().LifeStyle.Transient,
                AllTypes.Pick()
                    .From(typeof (Foo))
                    .If(t => typeof (IFoo).IsAssignableFrom(t))
                    .Configure(c => c.LifeStyle.Is(LifestyleType.Transient)
                                        .Interceptors(new InterceptorReference(typeof (MyInterceptor))).Anywhere)
                    .WithService.Select(new[] {typeof(IFoo)}));
    
            container.Resolve<IFoo>().Do();
        }
    }
    
    推荐文章