Читая этот пост в блоге, он упоминает, что вы можете заставить свой контейнер 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
.
Что мне не хватает?