Eine typische Implementierung eines DDD-Repository sieht nicht besonders gut aus, zum Beispiel eine save()
Methode:
package com.example.domain;
public class Product { /* public attributes for brevity */
public String name;
public Double price;
}
public interface ProductRepo {
void save(Product product);
}
Infrastrukturteil:
package com.example.infrastructure;
// imports...
public class JdbcProductRepo implements ProductRepo {
private JdbcTemplate = ...
public void save(Product product) {
JdbcTemplate.update("INSERT INTO product (name, price) VALUES (?, ?)",
product.name, product.price);
}
}
Eine solche Schnittstelle erwartet Product
, dass es sich zumindest bei Gettern um ein anämisches Modell handelt.
Andererseits sagt OOP, dass ein Product
Objekt wissen sollte, wie es sich selbst retten kann.
package com.example.domain;
public class Product {
private String name;
private Double price;
void save() {
// save the product
// ???
}
}
Die Sache ist, wenn der Product
weiß, wie er sich selbst speichert, bedeutet dies, dass der Infrastrukturcode nicht vom Domänencode getrennt ist.
Vielleicht können wir die Speicherung an ein anderes Objekt delegieren:
package com.example.domain;
public class Product {
private String name;
private Double price;
void save(Storage storage) {
storage
.with("name", this.name)
.with("price", this.price)
.save();
}
}
public interface Storage {
Storage with(String name, Object value);
void save();
}
Infrastrukturteil:
package com.example.infrastructure;
// imports...
public class JdbcProductRepo implements ProductRepo {
public void save(Product product) {
product.save(new JdbcStorage());
}
}
class JdbcStorage implements Storage {
private final JdbcTemplate = ...
private final Map<String, Object> attrs = new HashMap<>();
private final String tableName;
public JdbcStorage(String tableName) {
this.tableName = tableName;
}
public Storage with(String name, Object value) {
attrs.put(name, value);
}
public void save() {
JdbcTemplate.update("INSERT INTO " + tableName + " (name, price) VALUES (?, ?)",
attrs.get("name"), attrs.get("price"));
}
}
Was ist der beste Ansatz, um dies zu erreichen? Ist es möglich, ein objektorientiertes Repository zu implementieren?