Вопрос

Я пытаюсь заставить работать написанный мной перехватчик, но по какой-то причине, похоже, он не создает экземпляр перехватчика, когда я запрашиваю свои компоненты.Я делаю что-то вроде этого (простите меня, если это не совсем компилируется, но вы должны уловить идею):

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, но я очень хочу использовать свободный интерфейс.

Мы были бы очень признательны за любую помощь!

Это было полезно?

Решение

Я думаю, ты злоупотребляешь 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();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top