2

我有一个使用领域驱动设计的小型应用程序,现在我想要一个带有翻译的实体。

我在互联网上读到域驱动设计的最佳实践是将翻译与模型分开,但我不知道该怎么做。

这是我所拥有的一个例子:

@Entity
class Product {
    @Id
    private String id;
    private String name;
    private String description;
    private BigDecimal price;
    private BigDecimal originalPrice;

    ...
}

@Service
class ProductService {

    @Autowired
    private ProductRepository productRepository;

    public List<Product> getAll() {
        return productRepository.findAll();
    }

    public List<Product> getById(String id) {
        return productRepository.findById(id);
    }

    public List<Product> create(ProductDto productDto) {
        Product product = new Product(
            productDto.getName(),
            productDto.getDescription(),
            productDto.getPrice(),
            productDto.getOriginalPrice()
        );
        return productRepository.save(product);
    }
}

然后我的问题是:

想象一下,我正在接收产品 DTO 中的翻译,我想知道如何去做。

感谢并感谢您的帮助。

4

2 回答 2

0

这不是您的核心领域真正感兴趣的东西,您应该需要对其进行建模。您可能会有一些翻译子域,您会对这些内容感兴趣,但该设计将专注于将键/语言对映射到翻译。

您的核心域将为您的位置使用某种默认语言,这将是核心域中众所周知且必需的条目。例如,您Product可能有一个ProductID(或SKU或类似的)以及一个Description. 该描述将使用默认语言。

您的翻译将作为更多的基础设施服务在集成层上,并且如果有可用的描述,将提供翻译的描述;否则,您的域中应该需要的默认值。

更新:

我给出的另一个答案DDD: DTO usage with different logic

例如(广泛):

public Translation 
{
    string Locale { get; set; }
    string Value { get; set; }
}

public interface ILocalisationQuery
{
    Translation For(string locale, string key);
    IEnumerable<Translation> For(string key);
}

public class LocalisationQuery : ILocalisationQuery
{
    public Translation For(string locale, string key)
    {
        // lookup from localisation data store
    }

    public IEnumerable<Translation> For(string key)
    {
        // lookup from localisation data store
    }
}

您将实施对您有意义且适用于您的用例的策略。假设您想获取spoon产品的 Fench 描述,并且您已将其用作product-spoon键的约定:localisation.For('fr', 'product-spoon');.

对于我的 JavaScript 前端,我使用i18next

于 2017-11-29T05:02:06.027 回答
0

我建议将您的域模型与您的数据模型区分开来。虽然在您的领域模型中,您真的不会关心任何翻译,它看起来就像您建议的那样,但您的数据模型可能看起来不同:

@Entity
class Product {
    @Id
    private String id;
    private BigDecimal price;
    private BigDecimal originalPrice;
    private List<ProductTranslation> translations;

    ...
}

@Entity
class ProductTranslation{
    @Id
    private String id;
    private String name;
    private String description;
    private Int languageId;

    ...
}

然后在您的存储库中,您将从您的域模型映射到您的数据模型,同时您languageId将从一些应用程序设置中获取。

于 2017-11-29T09:54:58.623 回答