2017-02-22 2 views
1

Ich versuche Domain-Ereignisse in mein System zu implementieren, aber ich stecke fest. Ich benutze SimpleInjector, und ich denke, ich vermisse etwas.Einfacher Injektor mit Domain-Ereignissen

Domain Veranstaltung:

public static class DomainEvent 
{ 
    public static IEventDispatcher Dispatcher { get; set; } 

    public static void Raise<T>(T @event) where T : IDomainEvent 
    { 
     Dispatcher.Dispatch(@event); 
    } 

} 

SimpleInjectorEventDispatcher

public class SimpleInjectorEventDispatcher : IEventDispatcher 
{ 
    private readonly Container container; 
    public SimpleInjectorEventDispatcher(Container container) 
    { 
     this.container = container; 
    } 

    public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent 
    { 
     var handlerType = typeof(IDomainHandler<>).MakeGenericType(eventToDispatch.GetType()); 
     var handlers = this.container.GetAllInstances(handlerType); 

     foreach (dynamic handler in handlers) 
     { 
      handler.HandleEvent((dynamic)eventToDispatch); 
     } 
    } 
} 

SimpleInjector

container.Register<IEventDispatcher, SimpleInjectorEventDispatcher>(); 

Der IEventDispatcher Dispatcher ist immer null. Wie stelle ich sicher, dass es richtig initialisiert ist?

Antwort

1

Der IEventDispatcher-Dispatcher ist immer null.

Simple Injector initialisiert keine statischen Elemente einer zufälligen Klasse für Sie. Solange Sie dieses statische Feld beim Start nicht selbst gesetzt haben, wird es niemand tun.

Ich würde Sie jedoch dringend bitten, diese statische DomainEvent Klasse vollständig zu stoppen. Dieser Entwurf ist in einem old article von Udi Dahan verwurzelt, aber er selbst hat die Idee der Verwendung von statischen Klassen für diesen Zweck vor langer Zeit selbst aufgegeben. Gegenwärtig berät er darüber, ebenso wie ich.

Statische Klassen sind im Hinblick auf Testbarkeit und Auffindbarkeit problematisch. Aus dieser Perspektive ist die Verwendung von Dependency Injection eine viel bessere Alternative.

Die Lösung für Ihr Problem ist daher sehr einfach: Entfernen Sie die statische DomainEvents Klasse aus Ihrer Codebasis und injizieren Sie die IEventDispatcher in die Konstruktoren der Verbraucher, die Ereignisse veröffentlichen müssen.

+0

Vielen Dank für Ihre ausführliche Antwort! Ich werde deinen Ratschlag nehmen und die statische Klasse ablegen. Bedeutet das, dass alle meine Entitäten einen Konstruktor benötigen, der einen IEventDispatcher akzeptiert? – Wekslie

+1

Entitäten? Nein. Entitäten sollten ihre Abhängigkeiten nicht mit Constructor Injection erhalten. Wenn Sie DDD anwenden möchten, sollten Sie Method Injection verwenden, d. H. Die Entitätsmethode, die die Abhängigkeit tatsächlich verwendet, sollte sie über ihre Methode anfordern. – Steven

+0

Danke nochmal! Eine weitere verwandte Frage: Der SimpleInjectorEventDispatcher hat ein Container-Feld. Wie kann ich dieses Feld festlegen, um den Container aus meiner SimpleInjectorConfiguration zu verwenden? – Wekslie

Verwandte Themen