Чтобы зарегистрироваться только на одном интерфейсе, вы обычно используете FirstInterface:
AllTypes
.FromAssemblyContaining<ITabViewModel>()
.BasedOn<ITabViewModel>()
.WithService
.FirstInterface();
Однако в этом случае вы получите свою службу, зарегистрированную в INotifyPropertyChanged, а это не то, что вам нужно, поскольку она выбирает первый интерфейс из базового класса (посмотрите на класс ServiceDescriptor, чтобы увидеть, какие другие регистрации доступны).
Вам нужен метод Select, который позволяет вам определить тип или типы, для которых вы хотите зарегистрировать службу:
AllTypes
.FromAssemblyContaining<ITabViewModel>()
.BasedOn<ITabViewModel>()
.WithService
.Select(typeof(ITabViewModel));
Однако, если вы хотите сделать вещи более общими, кто-то написал метод расширения, который просматривает регистрируемую службу и выбирает первый интерфейс в производном классе (http://www.hightech.ir/SeeSharp/windsor-registration-service-interface):
public static BasedOnDescriptor FirstInterfaceOnClass(this ServiceDescriptor serviceDescriptor)
{
return serviceDescriptor.Select((t, bt) =>
{
var baseInterfaces = t.BaseType.GetInterfaces();
var interfaces = t.GetInterfaces().Except(baseInterfaces);
return interfaces.Count() != 0 ? new[] {interfaces.First()} : null;
});
}
Что позволяет вам сделать это:
AllTypes
.FromAssemblyContaining<ITabViewModel>()
.BasedOn<ITabViewModel>()
.WithService
.FirstInterfaceOnClass();