Estoy tratando de introducir eventos de dominio en un proyecto. El concepto se describe en el post de Udi Dahan - http://www.udidahan.com/2009/06/14/domain-events-salvation/Uso de Autofac con eventos de dominio
Aquí está el código de evento dominio
public interface IDomainEvent { }
public interface IHandleDomainEvents<T> where T : IDomainEvent
{
void Handle(T args);
}
public interface IEventDispatcher
{
void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent;
}
public static class DomainEvents
{
public static IEventDispatcher Dispatcher { get; set; }
public static void Raise<TEvent>(TEvent eventToRaise) where TEvent : IDomainEvent
{
Dispatcher.Dispatch(eventToRaise);
}
}
La parte más importante es la implementación IEventDispatcher que desacopla el caso del dominio de lo tiene que suceder cuando se ha producido el evento. El truco es conectar este acoplamiento a través de un contenedor. Aquí está mi intento
Código para el registro de todos los controladores de eventos de dominio ....
var asm = Assembly.GetExecutingAssembly();
var handlerType = typeof(IHandleDomainEvents<>);
builder.RegisterAssemblyTypes(asm)
.Where(t => handlerType.IsAssignableFrom(t)
&& t.IsClass
&& !t.IsAbstract)
.AsClosedTypesOf(handlerType)
.InstancePerLifetimeScope();
y resolver todos los controladores de eventos en el despachador. El problema es que no se han resuelto los controladores.
public class EventDispatcher : IEventDispatcher
{
private readonly IContainer _container;
public EventDispatcher(IContainer container)
{
_container = container;
}
public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent
{
var handlers = _container.Resolve<IEnumerable<IHandleDomainEvents<TEvent>>>().ToList();
handlers.ForEach(handler => handler.Handle(eventToDispatch));
}
}
Así que no estoy registrando los controladores de eventos correctamente o no los está resolviendo. ¿Cómo verifico si el registro está funcionando?
Código de ejemplo de un manejador de
public class SendWebQuestionToCSO : IHandleDomainEvents<JobNoteCreated>
{
private readonly IConfig _config;
public SendWebQuestionToCSO(IConfig config)
{
_config = config;
}
public void Handle(JobNoteCreated args)
{
var jobNote = args.JobNote;
using(var message = new MailMessage())
{
var client = new SmtpClient {Host = _config.SmtpHostIp};
message.From = new MailAddress(_config.WhenSendingEmailFromWebProcessUseThisAddress);
...... etc
}
}
}
ACTUALIZACIÓN Después de algunos ensayos y errores del EventDispatcher está trabajando bien! Si registro manualmente un controlador y luego activa el evento de dominio, funciona. El escaneo/registro de la asamblea es mi problema. El código de registro manual ...
builder.RegisterType<SendWebQuestionToCSO >().As<IHandleDomainEvents<JobNoteCreated>>();
Entonces, ¿cómo puedo escanear todos los montajes para todos IHandleDomainEvents<>
dan se ven así
public class SendWebQuestionToCSO : IHandleDomainEvents<JobNoteCreated>
¡Perfecto Nick! ¡Estoy esperando su próximo curso! – CRG
Ah, sí, incluso más suave. Me robaron de 15 rep sin embargo! –
Hehe como si lo necesitaras, Sr. L.;) no obstante obtuviste mi voto. –