Một triển khai điển hình của kho lưu trữ DDD trông không giống OO, ví dụ như một save()
phương thức:
package com.example.domain;
public class Product { /* public attributes for brevity */
public String name;
public Double price;
}
public interface ProductRepo {
void save(Product product);
}
Phần cơ sở hạ tầng:
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);
}
}
Một giao diện như vậy hy vọng sẽ Product
là một mô hình thiếu máu, ít nhất là với getters.
Mặt khác, OOP nói rằng một Product
đối tượng nên biết cách tự cứu mình.
package com.example.domain;
public class Product {
private String name;
private Double price;
void save() {
// save the product
// ???
}
}
Vấn đề là, khi Product
biết cách tự lưu, điều đó có nghĩa là mã cơ sở hạ tầng không tách rời khỏi mã miền.
Có lẽ chúng ta có thể ủy thác việc tiết kiệm cho một đối tượng khác:
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();
}
Phần cơ sở hạ tầng:
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"));
}
}
Cách tiếp cận tốt nhất để đạt được điều này là gì? Có thể thực hiện một kho lưu trữ hướng đối tượng?