0

У меня есть WindsorContainer с IModelInterceptorsSelector. Он хорошо работает, за исключением компонентов, которые не имеют реализации (например, все поведение обрабатывается динамически IInterceptor).Замок Виндзорский прокси для интерфейса без цели

Если я пытаюсь решить компонент с интерфейсом только я получаю:

Castle.MicroKernel.ComponentActivator.ComponentActivatorException occurred 
    Message=Could not find a public constructor for type ConsoleApplication1.IInterfaceOnlyService. Windsor can not instantiate types that don't expose public constructors. To expose the type as a service add public constructor, or use custom component activator. 
    Source=Castle.Windsor 
    StackTrace: 
     at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.FastCreateInstance(Type implType, Object[] arguments, Type[] signature) 

Но если я вручную указать перехватчик во время регистрации, он работает просто отлично. Это ошибка в Виндзоре, или я делаю что-то неправильно?

Код для воспроизведения достаточно прост:

 var container = new WindsorContainer(); 
     container.Kernel.ProxyFactory.AddInterceptorSelector(new Selector()); 
     container.Register(Component.For<TestInterceptor>()); 
     container.Register(Component.For<IInterfaceOnlyService>()); // this doesn't work 
     // container.Register(Component.For<IInterfaceOnlyService>().Interceptors<TestInterceptor>()); // this works 
     var i = container.Resolve<IInterfaceOnlyService>(); 


    public class Selector : IModelInterceptorsSelector 
    { 
     public bool HasInterceptors(ComponentModel model) 
     { 
      return model.Service != typeof (TestInterceptor); 
     } 

     public InterceptorReference[] SelectInterceptors(ComponentModel model, InterceptorReference[] interceptors) 
     {     
      return new[] { InterceptorReference.ForType<TestInterceptor>() }; 
     } 
    } 

Спасибо.

+0

Не знал, что вы можете сделать это с Виндзором и неправильно известить вопрос из-за этого. Удаленный ответ. –

ответ

0

Это определенно кажется ошибкой в ​​Виндзоре. Похоже, что это связано с принятием InterceptorGroup для компонентов без цели. То есть:

работает.

container.Register(Component.For<IInterfaceOnlyService> 
().Interceptors(InterceptorReference.ForType(typeof(TestInterceptor)))); 

Глядя на источник Замковой, разница в том, что первая добавляет adescriptor непосредственно:

return this.AddDescriptor(new InterceptorDescriptor<TService>(new 
InterceptorReference[] { new InterceptorReference(typeof(TInterceptor)) })); 

Но второй использует перехватчик группу внутренне:

return new InterceptorGroup<TService>((ComponentRegistration<TService>) this, 
interceptors); 

Соответственно, это кажется, является ошибкой в ​​InterceptorGroups.

Моим обходным (хотя и взломанным) способом является использование моего LazyComponentLoader для прямого вызова AddDescriptor.