Чтение в этом блоге упоминается, что вы можете заставить свой DI-контейнер автоматически подписываться на события, если он реализует IHandle<>
.Это именно то, чего я пытаюсь достичь.
Вот что у меня есть до сих пор.
container.Register(Component
.For<MainWindowViewModel>()
.ImplementedBy<MainWindowViewModel>()
.LifeStyle.Transient
.OnCreate((kernel, thisType) => kernel.Resolve<IEventAggregator>().Subscribe(thisType)));
Пока этот код успешно подписывается MainWindowViewModel
для получения опубликованных сообщений, пришло времяна самом деле получать сообщения ничего не происходит.Если я вручную подписываюсь, все работает, как и ожидалось.
Вот мой MainWindowViewModel
класс.
public class MainWindowViewModel : IHandle<SomeMessage>
{
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);
}
}
Как я могу сказать Виндзору, чтобы автоматически подписываться, если какой-либо класс наследует 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<IEventAggregator>();
aggregator.Subscribe(client.Implementation);
}
}
}
Глядя на класс EventAggregator
, предоставленный Caliburn.Micro Я могу видеть, что подписка прошла успешно, однакоесли другой класс публикует сообщение, класс MainWindowViewModel
не обрабатывается.Вручную подписка все еще работает, но я хотел бы автоматизировать этот процесс.У меня такое ощущение, что это не подписка на правильный экземпляр.Не уверен, как это исправить.
Я также пытался использовать любое другое событие, предоставляемое свойством Kernel
.Большинство из них не могут решить IEventAggregator
.
Чего мне не хватает?