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?
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
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
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