2016-03-22 7 views
0

У меня есть следующий метод, который вызывает событие домена. Экземпляр 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>?

Я не совсем понимаю, почему это не работает - может ли кто-нибудь помочь?

+0

Похоже, что вы используете 'Register' вместо' RegisterCollection': пожалуйста, покажите код, который регистрирует – qujck

+0

@qujck OP. Его нужно здесь 'container.Register (typeof (IDomainEventHandler <>), сборки); «Я думаю, что ты прав. RegisterCollection должен помочь. –

+0

@qujck Это была проблема (регистрационный код выше). Если вы опубликуете ответ, я могу его принять. – Graham

ответ

3

ошибка приводит меня к мысли, вы используете Register вместо RegisterCollection: элементы, зарегистрированные Register разрешаются с GetInstance, элементы, зарегистрированные RegisterCollection разрешаются с GetAllInstances.