我们已经拆分了我们的产品和价格模型,因为两者都相当复杂,并且它们分开用于编辑和显示的用例。
我想从Product中相对直接访问一些更常见的Price字段,因为use-link-if-it-it-and-create-it-it-it-not-logic出现了很多而且中等复杂:我不想在可能需要它的十个地方的每一个中重复十几行,单独测试它们,然后必须记住如果/当逻辑改变时更新它们。将这个逻辑放在产品上是有道理的,因为我习惯于将“价格”视为产品的属性。
不幸的是,这意味着我正在尝试注入/自动访问Product类上的PriceRepository。我觉得这不是一个好主意,但感觉所有的想法都很糟糕。
我们在Spring Framework中使用DynamoDB和Java。这是该类的玩具版本:
@DynamoDBTable(tableName = "Product")
@Configurable
public class Product {
private String id;
private Price price;
@Inject
@Transient
@DynamoDBIgnore
private static transient PriceRepository priceRepository;
@DynamoDBHashKey(attributeName = "Id")
@DynamoDBAutoGeneratedKey
public String getId() {return id}
public void setId(String id) {this.id = id;}
@DynamoDBIgnore
public List<PricingOption> getPricingOptions() {
setOrCreatePrice();
return price.getPricingOptions();
}
public void setPricingOptions(List<PricingOption> options) {
setOrCreatePrice();
price.setPricingOptions(options);
}
public void setOrCreatePrice() {
// simplified, skipping the cases when this.getId() returns null
if (price != null)
return;
Price price = priceRepository.findOneByProductId(this.getId());
if (price != null) {
this.price = price;
return;
}
price = new Price();
price.setProductId(this.getId());
}
}
通过产品查看PricingOptions目前与添加产品,更新产品,根据客户需求选择定价选项,输入营销数据等相关联。每个位置都有一个单独的Bean,并以稍微不同的方式使用产品。
这似乎应该是一种相当普遍的事情,但我没有看到与OOP,DRY以及Spring应该将事物链接在一起的方式一致的选项。也许我应该为可能需要数据的所有Beans插入一个共同的超类?我很欣赏一些建议。