【发布时间】:2015-05-04 14:13:42
【问题描述】:
嗨,我怎么找不到这个问题的答案: 我有事件处理程序ala:
public class MyEvenHandler : EventHandler<MyEvent>
EventHandler 是一个抽象类
public abstract class EventHandler<TEvent> : IEventHandler<TEvent>
where TEvent : IDomainEvent
和
public interface IEventHandler<in TEvent> : IEventHandler where TEvent : IDomainEvent
{
bool Handles(IDomainEvent @event);
void Handle(TEvent @event);
Task HandleAsync(TEvent @event);
}
我这样注册 autofac:
var builder = new ContainerBuilder();
builder.RegisterSource(new ContravariantRegistrationSource());
...
builder.RegisterAssemblyTypes(commandsAssemblies)
.AsClosedTypesOf(typeof(EventHandler<>))
.AsImplementedInterfaces()
.InstancePerRequest();
现在我想解析所有事件处理程序并将它们注册到 messageDispatcher 类
var handlers = e.Context.Resolve<IEnumerable<IEventHandler<IDomainEvent>>>().ToList();
var handlers2 = e.Context.Resolve<IEnumerable<IEventHandler<PolicyCreated>>>().ToList();
处理程序变量为空... handlers2 正确解析。但我想通用解决所有处理程序
messageDispatcher (eventDispathcer) 看起来像这样:
public class EventDispatcher : IEventDispatcher
{
private readonly IList<IEventHandler> _eventHandlers = new List<IEventHandler>();
public virtual void RegisterEventHandler(IEventHandler eventHandler)
{
_eventHandlers.Add(eventHandler);
}
public virtual IMessageResults Publish<TEvent>(TEvent @event) where TEvent : IDomainEvent
{
var result = new MessageResults();
var handlers = _eventHandlers;
if (handlers == null)
{
Trace.WriteLine(String.Format("No event handlers for event {0} ", typeof(TEvent)));
result.AddResult(new MessageResult(true));
return result;
}
foreach (var eventHandler in handlers.Where(h => h.Handles(@event as IDomainEvent)))
{
eventHandler.Handle(@event);
}
return result;
}
public int EventHandlerCount
{
get
{
return _eventHandlers.Count();
}
}
}
总结目标:
- 使用程序集扫描
- 解析为 EventHandler 实现的 IEnumerable
【问题讨论】: