Domanda

Sto cercando di utilizzare xVal per convalidare la registrazione di un nuovo utente. Ho incontrato una sega circolare quando si cerca di implementare la logica che controlla per vedere se il nome utente che il nuovo utente sta cercando di registrare con è già stato preso. Non riesco a trovare un modo per ottenere questo risultato senza avere la mia entità utente ha una dipendenza sul mio UsersRepository. Ecco il metodo che ho bisogno di trovare un modo per implementare nella mia entità utente:

public IEnumerable<ErrorInfo> ValidateUniqueUserName(string username)
{
    if(usersRepository.Users.Exists(m => (m.UserName == username)))
        yield return new ErrorInfo("UserName", "User name already exists");
}

Tutte le idee su come posso continuare a utilizzare xVal per questo scenario e mantenere la mia entità utente disaccoppiato dal mio UsersRepository?

È stato utile?

Soluzione

DDD suggerisce che si potrebbe avere un dominio del servizio di astrarre gli utenti Repo dalla convalida del dominio (enforcing invariante).

Mi piacerebbe sapere dove il codice dal vostro esempio sopra risiede (servizio di validazione)? Ma Io suggerirei di assicurarsi che sia nel dominio. Ecco un modo intelligente per fissare la convalida complesso a soggetti che ancora supportano l'interfaccia IDataErrorInfo.

Quello che vorrei suggerire è un dominio del servizio all'interno del vostro metodo di convalida che restituisce la query Users.Exists. Qualcosa di simile:

        base.AddRule(new ValidationRule()
        {
            Properties = "username",
            Description = "User name already exists",
            validator = () => !(new UserService()).Users.Exists(m => (m.UserName == username))
        });

Nell'esempio sopra Userò DI per iniettare le dipendenze appropriate nel UserService per l'accesso dei repo / dati, ma è possibile utilizzare un metodo di creazione di fabbrica o manuale DI oggetto, se vi piace:

        base.AddRule(new ValidationRule()
        {
            Properties = "username",
            Description = "User name already exists",
            validator = () =>
                {
                    UserService us = ObjectFactory.GetInstance<UserService>();
                    return !us.Users.Exists(m => (m.UserName == username));
                }
        });

Nota: il sopra metodo richiede la proprietà validator essere impostato su false per indicare uno stato non valido (nel caso in cui non era chiaro).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top