Próbuję wprowadzić zdarzenia domeny do projektu. Koncepcja jest opisana w poście Udi Dahan jest - http://www.udidahan.com/2009/06/14/domain-events-salvation/Korzystanie z funkcji Autofac z wydażeniami domeny
Oto kod zdarzenia domenę
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);
}
}
Najważniejszą częścią jest wdrożenie IEventDispatcher że oddziela zdarzenie domeny z co musi się zdarzyć, gdy zdarzenie jest wywoływane. Sztuczka polega na podłączeniu tego złącza przez kontener. Oto moja próba
Kod Rejestrowanie wszystkich obsługi zdarzeń domeny ....
var asm = Assembly.GetExecutingAssembly();
var handlerType = typeof(IHandleDomainEvents<>);
builder.RegisterAssemblyTypes(asm)
.Where(t => handlerType.IsAssignableFrom(t)
&& t.IsClass
&& !t.IsAbstract)
.AsClosedTypesOf(handlerType)
.InstancePerLifetimeScope();
i rozwiązywania wszystkich procedur obsługi zdarzeń w dyspozytora. Problem polega na tym, że żadne procedury obsługi nie zostały rozwiązane.
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));
}
}
Nie rejestruję poprawnie procedur obsługi zdarzeń ani nie rozwiązuję ich. Jak sprawdzić, czy rejestracja działa?
Przykład kodu z obsługi
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 Po pewnym prób i błędów EventDispatcher działa ok! Jeśli ręcznie zarejestruję program obsługi, a następnie uruchomę zdarzenie domeny, to działa. Skanowanie/rejestracja zespołu jest moim problemem. Instrukcja kod rejestracyjny ...
builder.RegisterType<SendWebQuestionToCSO >().As<IHandleDomainEvents<JobNoteCreated>>();
Więc jak mogę skanować wszystkie zespoły dla wszystkich IHandleDomainEvents<>
podano one wyglądać tak
public class SendWebQuestionToCSO : IHandleDomainEvents<JobNoteCreated>
Perfect Nick! Nie mogę się doczekać nadchodzącego kursu! – CRG
Ah, tak, nawet gładsza. Okradziono mi 15 przedstawicieli! –
Hehe, jak tego potrzebujesz, panie L.;) mimo to dostałem mój głos. –