У меня есть следующий метод, который вызывает событие домена. Экземпляр IDomainEvent
передается методу и обрабатывается с использованием экземпляров IDomainEventHandler
, предоставленных методом GetAllInstances
SimpleInjector.SimpleInjector.GetAllInstances бросает непредвиденную ошибку
Метод выглядит следующим образом:
public static void Raise<T>(T domainEvent) where T : IDomainEvent
{
if (Container != null)
{
var handlerType =
typeof(IDomainEventHandler<>).MakeGenericType(domainEvent.GetType());
var handlers = Container.GetAllInstances(handlerType);
foreach (dynamic handler in handlers)
{
handler.Handle((dynamic)domainEvent);
}
}
}
Container
поставляется ранее в классе, который содержит этот метод, но он является экземпляром SimpleInjector IContainer
.
Пример IDomainEventHandler
для NewOrderEvent
выглядит следующим образом:
public class NewOrderEventHandler : IDomainEventHandler<NewOrderEvent>
{
public void Handle(NewOrderEvent args)
{
// Event handled here.
}
}
И образец IDomainEvent
выглядит следующим образом:
public class NewOrderEvent : IDomainEvent
{
public IOrder Order { get; set; }
}
IDomainEventHandler<>
зарегистрирован SimpleInjector как таковой:
var assemblies = new[] {
// Other assemblies use this too
typeof(NewOrderEventHandler).Assembly, // Event Handlers
};
container.Register(typeof(IDomainEventHandler<>), assemblies);
когда Я бегу метод, я получаю следующее исключение:
Нет регистрации для типа
IEnumerable<IDomainEventHandler<NewOrderEvent>>
может быть найден. Там есть, однако, регистрация дляIDomainEventHandler<NewOrderEvent>
; Вы имели в виду позвонитьGetInstance<IDomainEventHandler<NewOrderEvent>>()
или в зависимости отIDomainEventHandler<NewOrderEvent>
?
Я не совсем понимаю, почему это не работает - может ли кто-нибудь помочь?
Похоже, что вы используете 'Register' вместо' RegisterCollection': пожалуйста, покажите код, который регистрирует – qujck
@qujck OP. Его нужно здесь 'container.Register (typeof (IDomainEventHandler <>), сборки); «Я думаю, что ты прав. RegisterCollection должен помочь. –
@qujck Это была проблема (регистрационный код выше). Если вы опубликуете ответ, я могу его принять. – Graham