【发布时间】:2011-10-28 23:01:15
【问题描述】:
我创建了一个非常简单的事件发布器,它看起来像这样。
public class EventPublisher
{
private readonly IList<Func<IHandle>> _subscribers;
public EventPublisher(IList<Func<IHandle>> subscribers)
{
_subscribers = subscribers;
}
public void Publish<TPayload>(TPayload payload)
where TPayload : class
{
var payloadHandlers = _subscribers.OfType<Func<IHandle<TPayload>>>();
foreach (var payloadHandler in payloadHandlers)
{
payloadHandler().Handle(payload);
}
}
}
这是我必须发布的消息。
var subscribers = new List<Func<IHandle>> {() => new SomeHandler()};
var eventPublisher = new EventPublisher(subscribers);
eventPublisher.Publish(new SomeMessage { Text = "Some random text..." });
我遇到的问题是发布消息时找不到任何可以处理有效负载的处理程序。这是有道理的,因为我将订阅者注册为 Func<IHandle> 而不是 Func<IHandle<T>>。
我的处理程序类继承的接口来自 Caliburn.Micro.EventAggregator,它看起来像这样。
public interface IHandle {}
public interface IHandle<TMessage> : IHandle {
void Handle(TMessage message);
}
_subscribers 的类型必须是什么才能处理泛型类型可以是任何具体类型的IHandle<>?
【问题讨论】:
-
如果您仍在使用 Windsor,您可能会受益于使用它来实例化处理程序。它内置了对此类场景的支持。