public static ICommandRegistry RegisterCommands(
            ICommandRegistry registry,
            UserRepository repository,
            Func <string> tokenSource,
            Func <string, string> passwordHasher,
            int maxLoginAttempts,
            Func <DateTimeOffset> lockoutPolicy)
        {
            var handler      = new UserCommandHandler(tokenSource, passwordHasher, maxLoginAttempts, lockoutPolicy);
            var userRegistry = registry.For <User>();

            userRegistry
            .WithDefaults(repository.SaveNew, id => repository.Load(id),
                          repository.Save)
            .Create <CreateUser>(handler.Create)
            .Execute <VerifyEmailAndSetPassword>(handler.Execute)
            .Execute <ChangeEmail>(handler.Execute)
            .Execute <VerifyEmail>(handler.Execute)
            .Execute <ChangePassword>(handler.Execute)
            .Execute <ChangeName>(handler.Execute)
            .Execute <RequestResetPassword>(handler.Execute)
            .Execute <SetPassword>(handler.Execute);
            userRegistry
            .WithDefaults(
                (_, __) => throw new NotSupportedException(), id => repository.Load(id, true), repository.Save)
            .Execute <LoginUser, LoginResult>(handler.Execute)
            .Execute <ManualUnlock>(handler.Execute)
            .Execute <ManualLock>(handler.Execute);


            return(registry);
        }
 public static ICommandRegistryWithDefaults <T> WithDefaults <T>(
     this ICommandRegistry registry,
     Func <string, IReadOnlyList <Event>, Task <IReadOnlyList <StreamVersion> > > saveNew,
     Func <string, Task <LoadResult <T> > > loadExisting,
     Func <string, IReadOnlyList <Event>, IReadOnlyList <StreamVersion>, Task <IReadOnlyList <StreamVersion> > >
     saveExisting
     )
     where T : Aggregate
 {
     return(WithDefaults(registry.For <T>(), saveNew, loadExisting, saveExisting));
 }