Привет Некоторые, как я не могу найти ответ на этот вопрос: У меня есть обработчик события ала:Autofac решить все EventHandlers абстрактного базового класса
public class MyEvenHandler : EventHandler<MyEvent>
Где EventHandler является абстрактным классом
public abstract class EventHandler<TEvent> : IEventHandler<TEvent>
where TEvent : IDomainEvent
И
Я зарегистрированный autofac:
var builder = new ContainerBuilder();
builder.RegisterSource(new ContravariantRegistrationSource());
...
builder.RegisterAssemblyTypes(commandsAssemblies)
.AsClosedTypesOf(typeof(EventHandler<>))
.AsImplementedInterfaces()
.InstancePerRequest();
Теперь я хочу, чтобы разрешить все eventhandlers и зарегистрировать их с 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 принимает TEvent в качестве входного параметра в свой метод Handle, поэтому он не может быть объявлен как ковариантный. Теперь я добавил полную декларацию –
@ChristianJohansen посмотрю мои правки. Кстати, вы могли бы поделиться своим сообщениемDispatcher? Может быть что-то делать –
Конечно! Я добавил код для messageDispatcer (EventDispatcher) сейчас. Моя работа в настоящее время - это регистрация и разрешение как простой не общий интерфейс IEventHandler, ограничивающий мою работу только работой с интерфейсами. –