喜的所有事件处理一些我能怎么找不到回答这个问题: 我有事件处理程序ALA:Autofac解决抽象基类
public class MyEvenHandler : EventHandler<MyEvent>
如果事件处理程序是一个抽象类
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());
...
现在我要解决所有的事件处理器,并用messageDispatcher类
var handlers = e.Context.Resolve<IEnumerable<IEventHandler<IDomainEvent>>>().ToList();
var handlers2 = e.Context.Resolve<IEnumerable<IEventHandler<PolicyCreated>>>().ToList();
处理程序变量为空注册它们... handlers2正确解析。不过,我想解决genericly的所有处理
的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();
}
}
}
总结目标:
- 使用汇编扫描
- 决心实现IEnumerable的EventHandler
Thx回答! IEventHandler在其Handle方法中将TEvent作为输入参数,因此它不能被声明为协变。我已经添加了完整的声明 –
@ChristianJohansen查看我的编辑。顺便说一句,你可以分享你的messageDispatcher吗?可能有事要做 –
当然!我已经添加了messageDispathcer(EventDispatcher)的代码。我目前的工作是注册并解析为简单的非通用接口IEventHandler,将我的自我限制为仅使用接口。 –