Очередь доменных событий в C # - PullRequest
2 голосов
/ 25 июля 2011

В этой статье описан замечательный шаблон «Доменные события»: http://www.udidahan.com/2009/06/14/domain-events-salvation/

Однако в комментарии 27 пользователя Andy отмечен один существенный недостаток этого шаблона: если транзакция завершается неудачно, мы не хотим, чтобы события нашего домена выполнялись. Поэтому нам нужно создать какой-то механизм организации очередей.

К сожалению, похоже, что это значительно усложнит технику, которая должна была упростить систему.

Кто-нибудь знает какие-нибудь хорошие примеры или обсуждения событий в очереди домена, в частности решение, которое хорошо интегрируется с NHibernate?

1 Ответ

5 голосов
/ 26 июля 2011

Я разработал, как это сделать: секрет в методе RegisterSynchronization ITransaction NHibernate.

В качестве примера, вот как я могу отправить электронное письмо клиенту, только когда транзакция совершена:

public class NotifyCustomerEmail
{
    private void MailMessage { get; set; }

    public void SendAsyncOnceTransactionCommits()
    {
        if (MailMessage == null)
            ComposeMailMessage();

        NHibernateSessionManager
            .CurrentSession
            .Transaction
            .RegisterSynchronization(new SendEmailSynchronization(this.MailMessage));
    }
}
...