城堡拦截器与流畅的接口

时间:2009-07-27 15:48:10

标签: c# castle-windsor fluent-interface iinterceptor

我正在尝试使用我编写的拦截器来工作,但出于某种原因,当我请求我的组件时它似乎并没有实例化拦截器。我正在做这样的事情(原谅我,如果这不完全编译,但你应该明白):

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)));

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

过去我使用XML配置注册了我的拦截器,但我很想使用流畅的界面。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:6)

我认为你在滥用WithService.FromInterface。文档说:

  

使用工具查找sub   接口。例如:如果你有   IService和IProductService:   ISomeInterface,IService,   ISomeOtherInterface。你打电话的时候   FromInterface(typeof(IService))然后   将使用IProductService。有用   当你想注册所有你的   服务,但不想指定   所有这些。

你也错过了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();
    }
}