La risposta è in the source code, ecco una parte della realizzazione del UserManager al momento della scrittura:
public virtual async Task<IdentityResult> CreateAsync(TUser user,
CancellationToken cancellationToken = default(CancellationToken))
{
ThrowIfDisposed();
await UpdateSecurityStampInternal(user, cancellationToken);
var result = await ValidateUserInternal(user, cancellationToken);
if (!result.Succeeded)
{
return result;
}
if (Options.Lockout.EnabledByDefault && SupportsUserLockout)
{
await GetUserLockoutStore().SetLockoutEnabledAsync(user, true, cancellationToken);
}
await UpdateNormalizedUserNameAsync(user, cancellationToken);
await Store.CreateAsync(user, cancellationToken);
return IdentityResult.Success;
}
Quindi, in pratica ritornano sempre vero. Ciò significa che nella versione corrente, l'inserimento dei controlli di creazione in UserStore va contro l'utilizzo previsto del framework.
Tuttavia ho notato che questo verrà modificato nella prossima versione. L'interfaccia IUserStore diventerà:
Task<IdentityResult> CreateAsync(TUser user, CancellationToken cancellationToken);
e l'implementazione UserManager:
public virtual async Task<IdentityResult> CreateAsync(TUser user)
{
ThrowIfDisposed();
await UpdateSecurityStampInternal(user);
var result = await ValidateUserInternal(user);
if (!result.Succeeded)
{
return result;
}
if (Options.Lockout.AllowedForNewUsers && SupportsUserLockout)
{
await GetUserLockoutStore().SetLockoutEnabledAsync(user, true, CancellationToken);
}
await UpdateNormalizedUserNameAsync(user);
await UpdateNormalizedEmailAsync(user);
return await Store.CreateAsync(user, CancellationToken);
}
Quindi mettere la logica di creazione nella UserStore sarà possibile in quel momento. Questo sarà un modo migliore di progettare, secondo me, dal momento che il cliente non dovrebbe gestire i problemi di integrità.
Nel flusso dell'applicazione, quando un utente non può essere creato, si tratta di un caso eccezionale o parte del normale flusso di esecuzione? –
@YuvalItzchakov Grazie per l'interesse! Fa parte del normale flusso di esecuzione. Per dare più contesto, sto facendo la mia implementazione personalizzata di ASP.Identity in un assembly diverso, questo è il motivo per cui voglio gestire questo caso direttamente in UserStore per mantenere il cliente focalizzato sulla logica di business – reddy