NCQRS: как вы загружаетесь с домена? - PullRequest
0 голосов
/ 16 ноября 2011

Пройдите стандартный процесс регистрации:

  1. пользователь регистрируется

  2. пользователю отправлено письмо со ссылкой для активации аккаунта

  3. пользователь активирует учетную запись

проблема, о которой я говорю, это:

  • при создании первоначальной учетной записи мы храним имя пользователя, пароль, адрес электронной почты, ключ активации

  • когда пользователь щелкает ссылку ключа активации, мы проверяем ключ с помощью readmodel

  • затем мы запускаем ActivateAccountCommand, передавая имя пользователя

как загрузить учетную запись пользователя, чтобы активировать ее в домене?


изначально я хотел передать новым пользователям Acount.Id в readmodel, но нет доступа (который мне известен) из CommandExecutorBase - мы не сохраняем это:

protected override void ExecuteInContext(IUnitOfWorkContext context,
       CreateAccountViaFormRegistrationCommand command)
{
    var newKey = Guid.NewGuid().ToString();
    var newAccount = new Account(
            command.UserName, command.Email, command.Password, newKey);
    SendWelcomeEmail(command.Email, command.UserName, newKey);
    context.Accept();
}  

1 Ответ

2 голосов
/ 16 ноября 2011

Вы можете опубликовать событие AccountActivationKeySent, которое, в свою очередь, может быть обработано, чтобы заполнить любую проекцию, необходимую вам для чтения.Что-то вроде:

// 1. Create and send the command from your client:

var command = new CreateAccountViaFormRegistrationCommand {
    AccountId = Guid.NewGuid(),
    ...
}

// 2. Create a new account in your command handler

var newAccount = new Account(command.AccountId, ...);
context.Accept();

// 3. And your account constructor (assuming it's inheriting from one
//    of EventSource's subclasses, e.g. AggregateRootMappedByConvention) 
//    might look like this:

public Account(Guid accountId, string name, ...) {
  EventSourceId = accountId;
  ApplyEvent(new AccountCreated { AccountId = Id, ... } );
  ApplyEvent(new AccountActivationSent { AccountId = Id, ... })
}
...