Estoy teniendo un momento difícil para implementar eventing en un proyecto reciente.structuremap ObjectFactory.GetAllInstances <IHandle <TEvent>>()
He comprobado que StructureMap está escaneando el ensamble apropiado y añadiendo manejadores de sucesos
Scan(cfg =>
{
cfg.TheCallingAssembly();
cfg.IncludeNamespace("ABC.EventHandler");
cfg.ConnectImplementationsToTypesClosing(typeof(IHandle<>));
});
public class StructureMapEventDispatcher : IEventDispatcher
{
public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent
{
foreach (var handler in ObjectFactory.GetAllInstances<IHandle<TEvent>>())
{
handler.Handle(eventToDispatch);
}
}
}
Antes solía disparar eventos de dominio. Algo así como Dispatcher.RaiseEvent(new [domainEvent class](x,y,z));
y el evento se encenderá. Tenía que cambiar el diseño en el que estoy ahora collectiong eventos en una colección
_domainEvents = new Collection<IDomainEvent>();
y luego levantándolo después de haber salvado el dominio al repositorio
public static void Raise(ICollection<IDomainEvent> domainEvents)
{
foreach (var domainEvent in domainEvents)
{
DomainEventDispatcher.Raise(domainEvent);
}
}
pero ahora
ObjectFactory.GetAllInstances<IHandle<TEvent>>()
devuelve 0 recuento de controladores
si miro para
ObjectFactory.GetAllInstances<IHandle<DomainEventClass>>()
vuelve colección de controladores correctamente (actualmente tengo 2 y se nota 2 recuento)
... Estoy asumiendo que esto tiene algo que ver con eventos que están siendo criados como de tipo IDomainEvent
en lugar de tipo real y que está haciendo es difícil para structuremap resolverlo.
¿Cómo puedo resolver este problema?
Saludos,
El mar
-
Edición 1:
he conformado ese contenedor struturemap contiene todos los controladores de eventos escaneadas de la asamblea.
Editar 2
No sé cómo hacer esta pregunta a atraer más atención. Estoy agregando recompensas por una solución para lograr los resultados deseados. Si la pregunta no está clara, por favor pregunte.
Básicamente quiero que el ObjectFactory.GetAllInstances<IHandle<TEvent>>()
para volver manejadores para TEvent
donde TEvent
es de tipo IDomainEvent
. Los eventos que se deben generar se almacenan en Collection of IDomainEvent
y se generan después del hecho de que Domain se guardó (de la capa de servicio).
Pienso que debería haber alguna manera de hacer StructureMap saben que el caso planteado como IDomainEvent
es en realidad de Tipo DomainEvent
var = eventsToRaise distribuidor.EventsToRaise(); Adición de la información de la ventana de depuración:
Después de los acontecimientos se han planteado en la ventana despachador
Editar 3: Eventhough eventToRaise muestra como "DealerName cambiado" y "DealerCommunicationChanged"
typeof (TEvent) da como Tipo Domain.IDomainEvent
I Guesss si es posible conseguir podrán emitir t o Tipo de la derecha (desde dondequiera VS ventana de vigilancia está recibiendo información) que el problema podría resolverá
Resultado ----- ---
Tanto enfoque funcionó. Acerqué ambos a otros 2 miembros de mi equipo y pensamos que la solución sin reflexión debía seleccionarse como la respuesta correcta.
Hoy vamos a estar haciendo una prueba con cambio de aplicación y ver si hay algún problema con esta solución en la solución.
He upvoted solución basada en la reflexión como lo es también la respuesta correcta.
@Still esperando por cualquier sugerencia. – TheMar
¿El 'ObjectFactory.GetAllInstances>()' devolverá la lista que estás buscando? –
arootbeer
No, devuelve la lista sin controladores. – TheMar