2016-03-22 14 views
0

Ich habe die folgende Methode, die ein Domänenereignis auslöst. Eine Instanz von IDomainEvent wird an die Methode übergeben, und sie wird unter Verwendung von Instanzen verarbeitet, die von SimpleInjectors GetAllInstances-Methode bereitgestellt werden.SimpleInjector.GetAllInstances wirft unerwarteten Fehler

Das Verfahren sieht wie folgt aus:

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 zuvor in der Klasse zugeführt wird, die dieses Verfahren enthält, aber es ist eine Instanz einer SimpleInjector IContainer.

Ein Beispiel IDomainEventHandler für eine NewOrderEvent wie folgt aussieht:

public class NewOrderEventHandler : IDomainEventHandler<NewOrderEvent> 
{ 
    public void Handle(NewOrderEvent args) 
    { 
     // Event handled here. 
    } 
} 

und eine Probe IDomainEvent wie folgt aussieht:

public class NewOrderEvent : IDomainEvent 
{ 
    public IOrder Order { get; set; } 
} 

Die IDomainEventHandler<> mit SimpleInjector als solche registriert:

var assemblies = new[] { 
      // Other assemblies use this too 
      typeof(NewOrderEventHandler).Assembly, // Event Handlers 
     }; 

container.Register(typeof(IDomainEventHandler<>), assemblies); 

Wann Ich betreibe das Verfahren, erhalte ich die folgende Ausnahme:

Keine Anmeldung für Typ IEnumerable<IDomainEventHandler<NewOrderEvent>> gefunden werden konnte. Dort ist jedoch eine Registrierung für IDomainEventHandler<NewOrderEvent>; Meinen Sie, GetInstance<IDomainEventHandler<NewOrderEvent>>() oder IDomainEventHandler<NewOrderEvent> zu rufen?

Ich verstehe nicht ganz, warum das nicht funktioniert - kann jemand helfen?

+0

Es aussieht wie Sie verwenden 'Register' statt' RegisterCollection': zeigen Sie den Code, der die 'IDomainEventHandler' Registern – qujck

+0

@qujck OP haben es hier' container.Register (typeof (IDomainEventHandler <>), Baugruppen) Ich glaube, du hast Recht. RegisterCollection sollte helfen. –

+0

@qujck Das war das Problem (der Registrierungscode ist oben). Wenn Sie eine Antwort posten, kann ich sie akzeptieren. – Graham

Antwort

3

Der Fehler führt mich Sie verwenden Register statt RegisterCollection zu glauben: mit Register sind entschlossen, mit GetInstance, Einschreiben mit RegisterCollection aufgelöst mit GetAllInstances Produkte registriert.