Множественные регистрации в замке Виндзор

У меня есть следующая ситуация в приложении WPF:

public class ExpenseView : UserControl, IAccountingView {}

// just a marker, the contract is in IViewWindow
public interface IAccountingView : IViewWindow {}

И мне нужно иметь возможность зарегистрировать ExpenseView, чтобы его можно было разрешить двумя способами: как конкретный тип, ExpenseView и как IAccountingView (возможно, как еще один интерфейс).

Я регистрирую такие типы:

// I need a collection of IViewWindow to be used
Container.Register( Classes.FromAssemblyInDirectory( myTypes )
    .BasedOn<IViewWindow>()
    .WithServiceFromInterface()
    .LifestyleTransient()
    );

// all other types don't have interfaces, are used as concrete types.
Container.Register( Classes.FromAssemblyInDirectory( myTypes )
    .Where( type => type.IsPublic )
    .WithServiceSelf()
    .LifestyleTransient()
    );

Теперь это работает, создаются экземпляры ExpenseView и всех других типов, за исключением случаев, когда мне нужно использовать

var newInstance = container.Resolve( iView.ViewType );

чтобы получить другой экземпляр, где iView.ViewType — это конкретный тип ExpenseView (согласно примеру), я получаю это исключение:

'Castle.MicroKernel.ComponentNotFoundException'  
No component for supporting the service ExpenseView was found.

Любые идеи, почему это происходит и как заставить это работать?


person bdaniel7    schedule 28.05.2015    source источник


Ответы (1)


Здесь есть хорошее объяснение различных вариантов регистрации: http://docs.castleproject.org/Windsor.Registering-components-by-conventions.ashx

Чтобы зарегистрировать все реализации IViewWindow также с их конкретным типом, вы можете сделать:

Container.Register( Classes.FromAssemblyInDirectory( myTypes )
    .BasedOn<IViewWindow>()
    .WithServiceFromInterface()
    .WithServiceSelf()
    .LifestyleTransient()
    );
person Phil Degenhardt    schedule 29.05.2015
comment
Да, я прочитал эту страницу несколько раз, но, кажется, я не попал в раздел «Услуги являются накопительными» ... И мне никогда не приходило в голову, что я могу объединять регистрации для одного и того же типа. - person bdaniel7; 29.05.2015