Перехватчики Замков С Плавным интерфейсом
-
19-09-2019 - |
Вопрос
Я пытаюсь заставить работать написанный мной перехватчик, но по какой-то причине, похоже, он не создает экземпляр перехватчика, когда я запрашиваю свои компоненты.Я делаю что-то вроде этого (простите меня, если это не совсем компилируется, но вы должны уловить идею):
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();
}
}