У меня есть 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>() };
}
}
Спасибо.
Не знал, что вы можете сделать это с Виндзором и неправильно известить вопрос из-за этого. Удаленный ответ. –