У меня есть интерфейс.
// Assembly: Common
public interface IEventHandler<TEvent> where TEvent : IDomainEvent
{
void HandleEvent(TEvent theEvent);
}
// Assembly: Common
public interface IDomainEvent
{
}
// Assembly: Common
public interface IEventDispatcher
{
void Register(IEventHandler<IDomainEvent> handler);
void Dispatch(IDomainEvent theEvent);
}
// Assembly: Membership
public sealed class MemberRegistered : IDomainEvent
{
// event properties
}
Затем в моем проекте ASP MVC 5 у меня есть обработчик событий для событий.
public sealed class MemberRegisteredHandler : IEventHandler<MemberRegistered>
{
public MemberRegisteredHandler(ApplicationUserManager userManager)
{
this.userManager = userManager;
}
private ApplicationUserManager userManager;
public void HandleEvent(MemberRegistered theEvent)
{
User user = new User(
theEvent.MemberId.ToString(),
theEvent.Username,
theEvent.PersonalInformation.Email);
this.userManager.CreateUserWithRandomPassword(user);
}
}
В моем классе Startup
var container = new Container();
container.RegisterManyForOpenGeneric(
typeof(IEventHandler<>),
container.RegisterAll,
Assembly.GetExecutingAssembly());
container.Register<IEventDispatcher, SimpleEventDispatcher>();
При этом, как я могу получить event dispatcher
и зарегистрировать в нем все обработчики событий?
я пытался
var eventDispatcher = container.GetInstance<IEventDispatcher>();
foreach (var handler in container.GetAllInstances<IEventHandler<IDomainEvent>>())
{
eventDispatcher.Register(handler);
}
Но это не работает. метод GetAllInstances ничего не возвращает.
Things to note:
IEventDispatcher
зависит от моего конструктора EF DbContext, и у меня есть (прямо сейчас) два контекста. MembershipContext
и IdentityAccessContext
, оба производные от EventDipatchingContext
, происходящие от DbContext
. В основном это EventDispatchingContext : DbContext
, затем MembershipContext : EventDispatchingContext
EventDispatchingContext
отвечает за делегирование событий диспетчеру событий after its Commit() method is invoked
. Они не увольняются мгновенно на моих объектах домена. Я получил эту архитектуру из блога Джимми Богарда.
https://lostechies.com/jimmybogard/2014/05/13/a-better-domain-events-pattern/
Нужно ли в этом случае делать IEventDispatcher синглтоном? Почему?
Как правильно зарегистрировать обработчики в диспетчере событий?