Использование Autofac с событиями домена

Я пытаюсь представить домен события в проект. Концепция описана в сообщении Уди Дахана - 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

14
задан Mantas Čekanauskas 18 May 2016 в 23:23
поделиться