1

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

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 配置注册了我的拦截器,但我热衷于使用流畅的界面。

任何帮助将不胜感激!

4

1 回答 1

6

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

使用工具来查找子接口。例如:如果您有 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();
    }
}
于 2009-07-28T04:05:38.360 回答