我正在开发一个处理事件的系统:
public interface IEvent { ..}
public class CreateUserEvent : IEvent {...}
public class ChangeUserNameEvent : IEvent {...}
每个事件都有一个特定的处理程序
public interface IEventHandler<T> where T : IEvent { Handle(T @event); }
public class CreateUserEventHandler : IEventHandler<CreateUserEvent> { ... }
public class ChangeUserNameEventHandler : IEventHandler<ChangeUserNameEvent> {...}
到目前为止,一切都非常简单。但是,我想为正确的事件创建使用正确事件处理程序的类。
到目前为止,我想出了以下方法:
Dictionary<Type, object> EventHandlers; // stores all registered event handlers
// Note that at compile time I do not exactly know the specialization of IEvent
// so I cannot give HandleEvent a generic type parameter :(
void HandleEvent(IEvent @event)
{
// inspect the type of the event handler at runtime
// the event also needs to be dynamic. Even though we know its a
// specialization of IEvent that is compatible with
// the handlers .Handle method
var handler = EventHandlers[@event.GetType()] as dynamic;
hanler.Handle(@event as dynamic);
}
这个解决方案有效,但我必须使用两种动态类型,这让我很担心。我想我可能做出了错误的设计决定,但我想不出其他架构/模式可以摆脱这些动态。
所以我的问题归结为:如何选择和使用具有通用性且运行时自省最少的接口的正确实现?
注意我更喜欢 IEvent 和 IEventHandler 实现完全不知道这个过程的解决方案