es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Gestor de Usuarios de Identidad Personalizada de C# a F#

Actualmente tenemos el siguiente código:

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<ApplicationUser> passwordHasher, IEnumerable<IUserValidator<ApplicationUser>> userValidators, IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<ApplicationUser>> logger) : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
    {
    }

    public override async Task<IdentityResult> ResetPasswordAsync(ApplicationUser user, string token, string newPassword)
    {
        var result = await base.ResetPasswordAsync(user, token, newPassword);
        if (result.Succeeded)
        {
            user.ChangePasswordDate = DateTime.Now.AddYears(1);
            user.ChangePassword = false;
            await base.UpdateAsync(user);
        }
        return result;
    }
}

¿Cómo lo convertiría a F #?

Cualquier ayuda sería apreciada.

Saludos cordiales,

Glenn

Tags:  ,

Answer

  1. Avatar for davy.ai

    Hola Glenn,

    Para convertir este código en C# a F#, puede usar la misma estructura de clase, pero con algunos cambios menores de sintaxis. Aquí está el código equivalente en F#:

    type ApplicationUserManager(store:IUserStore<applicationuser>,
                                optionsAccessor:IOptions<identityoptions>, 
                                passwordHasher:IPasswordHasher<applicationuser>, 
                                userValidators:IEnumerable<><applicationuser>>,
                                passwordValidators:IEnumerable<><applicationuser>>,
                                keyNormalizer:ILookupNormalizer, 
                                errors:IdentityErrorDescriber, 
                                services:IServiceProvider,
                                logger:ILogger<><applicationuser>>)
        inherit UserManager<applicationuser>(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
    
        override x.ResetPasswordAsync(user:ApplicationUser, token:string, newPassword:string) = async {
            let! result = base.ResetPasswordAsync(user, token, newPassword) |> Async.AwaitTask
            if result.Succeeded then
                user.ChangePasswordDate <- DateTime.Now.AddYears(1)
                user.ChangePassword <- false
                do! base.UpdateAsync(user) |> Async.AwaitTask
            return result
        }
    

    Como puede ver, en lugar de la palabra clave public class, usamos la palabra clave type en F#. Definimos un nuevo tipo ApplicationUserManager que hereda de la clase UserManager<applicationuser>.

    En el constructor, los parámetros se separan por comas en lugar de punto y coma. Además, el tipo IEnumerable<t> se escribe como seq<t> en F#.

    El método ResetPasswordAsync se escribe mediante un bloque async y las palabras clave let! y do! para operaciones asíncronas. Para llamar al método base, usamos el operador |> Async.AwaitTask para convertir la tarea en una computación asíncrona de F#.

    ¡Espero que esto te ayude!

    Saludos cordiales,

    [Tu nombre]

Comments are closed.