public AutenticacionPorUsuario(IAutenticador autenticador, IFormateadorExcepciones formateadorExcepciones) { Autenticador = autenticador ?? throw new ArgumentNullException(nameof(autenticador)); Autenticar = ReactiveCommand.CreateFromTask(AutenticarImpl); errores = Autenticar.ThrownExceptions.Select(e => { if (formateadorExcepciones.PuedeFormatear(e)) { return(formateadorExcepciones.Formatear(e)); } else { throw new ArgumentException("El formateador no puede formatear la excepción.", e); } }) .ToProperty(this, x => x.Errores); tieneErrores = Autenticar .StartWith((Sesion)null) .Timestamp() .CombineLatest( Autenticar.ThrownExceptions .StartWith((Exception)null) .Timestamp(), (Sesion, Excepcion) => (Sesion, Excepcion)) .Select(v => v.Sesion.Timestamp < v.Excepcion.Timestamp && v.Excepcion.Value != null) .ToProperty(this, x => x.TieneErrores); }