Я пытаюсь представить домен события в проект. Концепция описана в сообщении Уди Дахана - http://www.udidahan.com/2009/06/14/domain-events-salvation/
Здесь ' s код события домена
public interface IDomainEvent { }
public interface IHandleDomainEvents where T : IDomainEvent
{
void Handle(T args);
}
public interface IEventDispatcher
{
void Dispatch(TEvent eventToDispatch) where TEvent : IDomainEvent;
}
public static class DomainEvents
{
public static IEventDispatcher Dispatcher { get; set; }
public static void Raise(TEvent eventToRaise) where TEvent : IDomainEvent
{
Dispatcher.Dispatch(eventToRaise);
}
}
Самой важной частью является реализация IEventDispatcher, которая отделяет событие домена от всего, что должно произойти при возникновении события. Хитрость заключается в том, чтобы подключить эту муфту через контейнер. Вот моя попытка
Код для регистрации всех обработчиков событий домена ....
var asm = Assembly.GetExecutingAssembly();
var handlerType = typeof(IHandleDomainEvents<>);
builder.RegisterAssemblyTypes(asm)
.Where(t => handlerType.IsAssignableFrom(t)
&& t.IsClass
&& !t.IsAbstract)
.AsClosedTypesOf(handlerType)
.InstancePerLifetimeScope();
И разрешение всех обработчиков событий в диспетчере. Проблема в том, что обработчики не разрешены.
public class EventDispatcher : IEventDispatcher
{
private readonly IContainer _container;
public EventDispatcher(IContainer container)
{
_container = container;
}
public void Dispatch(TEvent eventToDispatch) where TEvent : IDomainEvent
{
var handlers = _container.Resolve>>().ToList();
handlers.ForEach(handler => handler.Handle(eventToDispatch));
}
}
Поэтому я неправильно регистрирую обработчики событий или не решаю их. Как проверить, работает ли регистрация?
Пример кода обработчика
public class SendWebQuestionToCSO : IHandleDomainEvents
{
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
}
}
}
ОБНОВЛЕНИЕ После некоторых проб и ошибок EventDispatcher работает нормально! Если я вручную регистрирую обработчик, а затем запускаю событие домена, он работает. Сканирование / регистрация сборки - моя проблема. Код регистрации вручную ...
builder.RegisterType().As>();
Итак, как мне сканировать все сборки для всех IHandleDomainEvents
, если они выглядят так
public class SendWebQuestionToCSO : IHandleDomainEvents