У меня не хватает времени на реализацию событий в недавнем проекте.
Я проверил, что структура карты сканирует правильно, собирает и добавляет EventHandlers
Scan(cfg =>
{
cfg.TheCallingAssembly();
cfg.IncludeNamespace("ABC.EventHandler");
cfg.ConnectImplementationsToTypesClosing(typeof(IHandle<>));
});
public class StructureMapEventDispatcher : IEventDispatcher
{
public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent
{
foreach (var handler in ObjectFactory.GetAllInstances<IHandle<TEvent>>())
{
handler.Handle(eventToDispatch);
}
}
}
, прежде чем я использовал для запуска Event из домена.Что-то вроде Dispatcher.RaiseEvent(new [domainEvent class](x,y,z));
, и событие будет запущено.Мне пришлось изменить дизайн, в котором я сейчас нахожу коллекцию событий в коллекции
_domainEvents = new Collection<IDomainEvent>();
, а затем повысить ее после того, как я сохранил домен в хранилище
public static void Raise(ICollection<IDomainEvent> domainEvents)
{
foreach (var domainEvent in domainEvents)
{
DomainEventDispatcher.Raise(domainEvent);
}
}
, но теперь
ObjectFactory.GetAllInstances<IHandle<TEvent>>()
возвращает 0 счетчиков обработчиков
, если я наблюдаю
ObjectFactory.GetAllInstances<IHandle<DomainEventClass>>()
, он возвращает коллекцию обработчиков должным образом (в настоящее время у меня 2 и отображается 2 счетчика)
... Я предполагаю, что это как-то связано с событиями, возникающими как с типом IDomainEvent
, так и с фактическим типом, и это затрудняет его разрешение структурной картой.
Как я могу решитьэтот вопрос?
С уважением,
Март
-
Редактировать 1:
Я подтвердил, что контейнер struturemap содержит всеобработчики событий отсканированы из сборки.
Edit 2
Я не знаю, как заставить этот вопрос привлечь больше внимания.Я добавляю награду за решение для достижения желаемых результатов.Если вопрос не понятен, пожалуйста, задавайте.
В основном я хочу, чтобы ObjectFactory.GetAllInstances<IHandle<TEvent>>()
возвращал обработчики для TEvent
, где TEvent
имеет тип IDomainEvent
.События, которые должны быть вызваны, хранятся в коллекции IDomainEvent
и генерируются после того, как домен был сохранен (из сервисного уровня).
Я думаю, что должен быть какой-то способ сообщить структуре карты, что событие, вызванное какIDomainEvent
на самом деле имеет тип DomainEvent
var eventsToRaise = dealerr.EventsToRaise ();Добавление информации из окна отладки:
После возникновения событий в окне диспетчера
Редактировать 3: Eventhough eventToRaise отображается как «DealerName изменено»"и" DealerCommunicationChanged "
typeof (TEvent) дает тип как Domain.IDomainEvent
Я догадываюсь, возможно ли получить возможность приводить к нужному типу (из окна наблюдения VS, где появляется информация)проблема может быть решена
----- Результат ---
Оба подхода работают.Я связал обоих с двумя другими членами в моей команде, и мы чувствовали, что это решение без размышления будет выбрано в качестве правильного ответа.
Сегодня мы проведем тест с измененной реализацией и посмотрим, есть ли какие-либо проблемы с этимрешение в решении.
Я проголосовал за решение, основанное на отражении, так как оно также является правильным ответом.