喜的所有事件處理一些我能怎麼找不到回答這個問題: 我有事件處理程序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,將我的自我限制爲僅使用接口。 –