Использование Windsor для автоматической подписки на агрегатор событий с настраиваемой функцией

Читая этот пост в блоге, он упоминает, что вы можете заставить свой контейнер DI автоматически подписываться на события, если он реализует IHandle . Это именно то, что я пытаюсь выполнить.

Вот то, что у меня есть на данный момент.

container.Register(Component
    .For()
    .ImplementedBy()
    .LifeStyle.Transient
    .OnCreate((kernel, thisType) => kernel.Resolve().Subscribe(thisType)));

Хотя этот код успешно подписывает MainWindowViewModel на получение опубликованных сообщений, пришло время фактически получать сообщения ничего бывает. Если я подписываюсь вручную, все работает должным образом.

Вот мой класс MainWindowViewModel .

public class MainWindowViewModel : IHandle
{
    private readonly FooViewModel _fooViewModel;
    private readonly IEventAggregator _eventAggregator;

    public MainWindowViewModel(FooViewModel fooViewModel, IEventAggregator eventAggregator)
    {
        _fooViewModel = fooViewModel;
        _eventAggregator = eventAggregator;

        //_eventAggregator.Subscribe(this);

        _fooViewModel.InvokeEvent();
    }

    public void Handle(SomeMessage message)
    {
        Console.WriteLine("Received message with text: {0}", message.Text);
    }
}

Как я могу сказать Windsor автоматически подписаться, если какой-либо класс наследует IHandle ?

​​В итоге я придумал это настраиваемое средство для подписки.

public class EventAggregatorFacility : AbstractFacility
{
    protected override void Init()
    {
        Kernel.DependencyResolving += Kernel_DependencyResolving;
    }

    private void Kernel_DependencyResolving(ComponentModel client, DependencyModel model, object dependency)
    {
        if(typeof(IHandle).IsAssignableFrom(client.Implementation))
        {
            var aggregator = Kernel.Resolve();
            aggregator.Subscribe(client.Implementation);
        }
    }
}

Посмотрев на класс EventAggregator , предоставленный Caliburn.Micro, я могу увидеть, что подписка прошла успешно, однако если другой класс публикует сообщение, что класс MainWindowViewModel не обрабатывается. Подписка вручную все еще работает, но я хотел бы автоматизировать этот процесс. Такое ощущение, что подписывается не тот экземпляр. Однако не знаю, как это исправить.

Я также пробовал использовать все другие события, обнаруженные свойством Kernel . Большинство из них не могут разрешить IEventAggregator .

Что мне не хватает?

7
задан gcso 16 August 2011 в 14:22
поделиться