gcs*_*cso 7 c# castle-windsor caliburn.micro
阅读这篇博文,它提到你可以让你的DI容器自动订阅它实现的事件IHandle<>.这正是我想要完成的.
这是我到目前为止所拥有的.
container.Register(Component
.For<MainWindowViewModel>()
.ImplementedBy<MainWindowViewModel>()
.LifeStyle.Transient
.OnCreate((kernel, thisType) => kernel.Resolve<IEventAggregator>().Subscribe(thisType)));
Run Code Online (Sandbox Code Playgroud)
虽然此代码成功订阅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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果任何类继承,我如何告诉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<IEventAggregator>();
aggregator.Subscribe(client.Implementation);
}
}
}
Run Code Online (Sandbox Code Playgroud)
看看EventAggregatorCaliburn.Micro提供的类,我能够看到订阅是成功的,但是如果另一个类发布了一个消息,那么MainWindowViewModel该类就没有得到处理.手动订阅仍然有效,但我想自动化这个过程.我有一种感觉,它没有订阅正确的实例.但不知道如何解决这个问题.
我也尝试过使用该Kernel物业所暴露的其他活动.他们中的大多数都无法解决IEventAggregator.
我错过了什么?
“我有一种感觉,它没有订阅正确的实例。但不知道如何解决这个问题。”
您正在订阅实现的类型(System.Type 的实例),而不是正在解析的实际依赖项。该行:
aggregator.Subscribe(client.Implementation);
Run Code Online (Sandbox Code Playgroud)
应该
aggregator.Subscribe(dependency);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1046 次 |
| 最近记录: |