Frage

Ich versuche xVal zu verwenden, um die Registrierung eines neuen Benutzers zu validieren. Ich habe in eine Kreissäge laufe beim Versuch, die Logik zu implementieren, wenn der Benutzername überprüft, dass der neue Benutzer mit registrieren versucht, ist bereits vergeben. Ich kann das nicht scheinen, einen Weg zu finden, zu erreichen, ohne meine User-Einheit eine Abhängigkeit von meinem UsersRepository haben zu müssen. Hier ist die Methode, die ich brauche einen Weg zu finden, in der meine User-Entity zu implementieren:

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

Alle Ideen, wie kann ich weiterhin xVal für dieses Szenario verwenden, und mein Benutzer Einheit von meinem UsersRepository entkoppelt halten?

War es hilfreich?

Lösung

DDD würde vorschlagen, dass Sie einen Domain-Service zu abstrahieren haben könnten die Benutzer aus der Domäne Validierung (invariant setzend) Repo.

Ich mag oben befindet (Validierungsdienst), wo Sie den Code aus Ihrem Beispiel wissen? Aber ich würde vorschlagen, dass Sie sicherstellen, dass es in der Domäne ist. Hier ist ein cleverer Weg, komplexe Validierung Einheiten anschließen, die immer noch die IDataErrorInfo Schnittstelle unterstützen.

Was ich würde vorschlagen, ist ein Domain-Service in Ihrer Validierungsmethode, die Ihre Users.Exists Abfrage zurückgibt. So etwas wie:

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

In dem obigen Beispiel i DI wird mit den entsprechenden Abhängigkeiten in die UserService zu injizieren für die Repo / Daten zugreifen, aber man könnte eine Fabrik oder manuelle DI Objekterstellung Methode verwenden, wenn Sie mögen:

        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));
                }
        });

Hinweis: Die obige Verfahren erfordert die validator Eigenschaft gesetzt werden, um false einen ungültigen Zustand anzuzeigen (in dem Fall, dass nicht klar war).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top