Sto tentando di introdurre eventi di dominio in un progetto. Il concetto è descritto nel post di Udi Dahan - http://www.udidahan.com/2009/06/14/domain-events-salvation/Utilizzo di Autofac con eventi di dominio
Ecco il dominio codice evento
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 più importante è l'implementazione IEventDispatcher che disaccoppia l'evento dominio da ciò che deve accadere quando l'evento viene generato. Il trucco è quello di cablare questo accoppiamento attraverso un contenitore. Ecco il mio tentativo
Codice in materia di registrazione di tutti i gestori di eventi di dominio ....
var asm = Assembly.GetExecutingAssembly();
var handlerType = typeof(IHandleDomainEvents<>);
builder.RegisterAssemblyTypes(asm)
.Where(t => handlerType.IsAssignableFrom(t)
&& t.IsClass
&& !t.IsAbstract)
.AsClosedTypesOf(handlerType)
.InstancePerLifetimeScope();
e risolvere tutti i gestori di eventi nel dispatcher. Il problema è che non vengono risolti i gestori.
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));
}
}
Quindi non sto registrando correttamente i gestori di eventi o non li risolvo. Come posso verificare che la registrazione funzioni?
codice Esempio di un gestore
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
}
}
}
UPDATE Dopo alcuni tentativi ed errori l'EventDispatcher sta funzionando bene! Se registro manualmente un gestore e poi sparo l'evento del dominio, funziona. Il processo di scansione/registrazione è il mio problema. Il codice di registrazione manuale ...
builder.RegisterType<SendWebQuestionToCSO >().As<IHandleDomainEvents<JobNoteCreated>>();
Allora, come faccio la scansione di tutte le assemblee per tutti IHandleDomainEvents<>
dato assomigliano questo
public class SendWebQuestionToCSO : IHandleDomainEvents<JobNoteCreated>
Nick perfetto! Non vedo l'ora del tuo prossimo corso! – CRG
Ah, sì, ancora più liscio. Mi ha derubato di 15 rep! –
Hehe like you need it, Mr. L.;) hai comunque il mio voto. –