13 Stimmen

Welche Methoden sollten in meiner DDD-Fabrikklasse enthalten sein?

Ich kämpfe, um zu verstehen, was meine Fabrik-Klasse in meinem DDD-Projekt tun sollte. Ja, eine Fabrik sollte für die Erstellung von Objekten verwendet werden, aber was genau sollte sie tun. Betrachten Sie die folgende Factory-Klasse:

    public class ProductFactory
    {
        private static IProductRepository _repository;

        public static Product CreateProduct()
        {
            return new Product();
        }

        public static Product CreateProduct()
        {
            //What else would go here?
        }

        public static Product GetProductById(int productId)
        {
            //Should i be making a direct call to the respoitory from here? 
            Greener.Domain.Product.Product p = _repository.GetProductById(productId);
            return p;
        }
    }

Sollte ich einen direkten Aufruf an das Repository aus der Fabrik heraus machen?

Wie sollte ich die Objekterstellung verwalten, wenn ich Daten aus einer Datenbank abrufe?

Was brauche ich, um diese Klasse vollständig zu machen, welche anderen Methoden sollte ich haben?

Sollte ich diese Klasse verwenden, um das Produktobjekt aus der Domäne und Repository von rechts zu erstellen?

Bitte um Hilfe!

1 Stimmen

Bauen Sie keine Repository-Logik in Ihre Fabrik ein.

0voto

@ThinkBeforeCoding - in @m4bwavs Beispiel erhält die Fabrik eine gültige ID von einer Hilfsmethode, aber sie erstellt nirgendwo einen neuen Datensatz in einer Persistenzschicht. Wenn ich jedoch eine automatisch generierte Identitätsspalte der Datenbank als meine Identitäten verwende, scheint es so, als müsste eine Factory das Repository aufrufen, um die anfängliche Objekterstellung durchzuführen. Können Sie sagen, welche Methode "richtig" ist?

0voto

Pablo Martin Viva Punkte 135

Im Builder können Sie jede Logik haben, die Sie brauchen, um die Invarianten auf Ihren Entitäten zu erzwingen, ein kleines Beispiel mit Java als Entwicklungssprache...

Ich habe eine User-Entität, die einen Benutzernamen, ein Passwort und eine E-Mail hat, alle Attribute erforderlich, so dass ich habe:

public class User {
    private String username;
    private String password;
    private String email:

    /**
     * @throws IllegalArgumentException if the username is null, the password is null or the
     * email is null.
     */
    public User(final String theUsername, final String thePassword, final String theEmail) {
        Validate.notNull(theUsername);
        Validate.notNull(thePassword);
        Validate.notNull(theEmail);

        this.username = theUsername;
        this.password = thePassword;
        this.email = theEmail;
    }

    // Getters / Setters / equal / hashCode / toString
}

und dann habe ich den UserBuilder:

public class UserBuilder {
    private String username;
    private String password;
    private String email;

    public UserBuilder withUsername(final String theUsername) {
        Validate.notNull(theUsername);

        this.username = theUsername;

        return this;
    }

    public UserBuilder withPassword(final String thePassword) {
        Validate.notNull(thePassword);

        this.password = thePassword;

        return this;
    }

    public UserBuilder withEmail(final String theEmail) {
        Validate.notNull(theEmail);

        this.email = theEmail;

        return this;
    }

    public User build() {
        User user = new User(this.username, this.password, this.email);

        return user;
    }
}

Und so können Sie den Builder verwenden:

UserBuilder builder = new UserBuilder();

try {
    User user = builder.withUsername("pmviva").withPassword("My Nifty Password").withEmail("pmviva@somehost.com").build();
} catch (IllegalArgument exception) {
    // Tried to create the user with invalid arguments
}

Der einzige Zweck der Fabrik besteht darin, gültige Instanzen von Objekten zu erzeugen. Um den Erstellungs- und Hydrierungscode nicht zu duplizieren, können Sie Ihre Repositories ein Rowset aus der Datenbank abfragen lassen und die Erstellung des Objekts an einen Builder delegieren, der die Daten des Rowsets weitergibt.

Ich hoffe, das hilft

Danke Pablo

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X