2011-09-02 9 views
0

Я проводил тест, используя JOlivers CommonDomain и EventStore с NServiceBus. Мне нужно, чтобы вызвать событие в моей Совокупности так:Как использовать интерфейс как события в JOlivers CommonDomain и EventStore?

RaiseEvent(bus.CreateInstance<IPhoneNumberChanged>(m => { m.Number = number; })); 

А потом у меня есть этот обработчик:

private void Apply(IPhoneNumberChanged phoneNumberChangedEvent) 
{ 
    this.Number = phoneNumberChangedEvent.Number; 
} 

К сожалению, это не работает. Я получаю исключение: «CommonDomain.Core.HandlerForDomainEventNotFoundException: Агрегат типа« Телефон »поднял событие типа« IPhoneNumberChanged », но не удалось найти обработчик для обработки сообщения».

Проблема заключается в том, что объект создан из «bus.CreateInstance», поскольку он работает с чистыми конкретными классами. Но мне нужны мои события как интерфейсы. Можно ли это решить?

EDIT: Просто примечание. Мне не нужно использовать «bus.CreateInstance», чтобы создать объект, это просто самый простой способ, который я в настоящее время должен поднять «IPhoneNumberChanged». Любой другой способ также был бы велик - до тех пор, пока у меня есть интерфейс в качестве аргумента в обработчике.

ответ

2

В конструкторе для вашего телефона агрегата, просто добавьте следующее:

this.Register<IPhoneNumberChanged>(this.Apply); 

Это будет заботиться за исключение. Внутренний механизм маршрутизации по умолчанию в CommonDomain является маршрутизатором, основанным на регистрации, чем понимает, как получить событие для соответствующего метода Handle - все без использования отражения. Другой маршрутизатор был написан и уже является частью проекта CommonDomain, который использует отражение и основан скорее на соглашениях.

Одна быстрая мысль о вашем названии мероприятия. Вместо того, чтобы говорить, что номер телефона изменен, вы можете указать событие , почему номер телефона изменен. С точки зрения домена, почему что-то всегда более интересно и важно, что что. Тот факт, что номер телефона изменился, обычно не интересен. Тот факт, что он изменился, потому что человек переехал или отменил свою учетную запись или что-то еще - это интересно и очень вероятно важно.

+0

Привет, Джонатан, к сожалению, он не работает. Я отлаживал его, и, хотя имя такое же (IPhoneNumberChanged), Type не является. Тип, построенный из Bus.CreateInstance, это «MyDomain .__ Impl.IPhoneNumberChanged», а зарегистрированный тип - «MyDomain.IPhoneNumberChanged». А поскольку «MyDomain__Impl.IPhoneNumberChanged» создается только во время выполнения, я не могу зарегистрировать его в CommonDomain. Какие-нибудь советы? – Werner

+0

Я думаю, что «this.Register (Type, action)» в основном, что я ищу? Или есть другое решение? – Werner

+0

Во-вторых, забудьте мой последний комментарий. Такая регистрация должна выполняться каждый раз, когда создается объект события. – Werner