gpt4 book ai didi

inversion-of-control - DDD,处理依赖关系

转载 作者:行者123 更新时间:2023-12-04 12:50:02 29 4
gpt4 key购买 nike

无聊简介:

我知道 - DDD 与技术无关。正如我所看到的 - DDD 就是与产品所有者一起创建无处不在的语言,并以如此简单和结构化的方式将其反射(reflect)到代码中,以至于它不能被误解或丢失。

但是这里出现了一个悖论——为了摆脱领域模型中应用程序的技术方面,它变得有点技术——至少从设计角度来看是这样。

上次我尝试遵循 DDD - 它最终将域对象之外的整个逻辑变成了“魔法”服务和贫血的域模型。

我学到了一些新的忍者技巧,想知道这次我是否能对付歌利亚。

问题:

class store : aggregateRoot { 
products;
addProduct(product){
if (new FreshSpecification.IsSatisfiedBy(product))
products.add(product);
}
}

class product : entity {
productType;
date producedOn;
}

class productTypeValidityTerm : aggregateRoot {
productType;
days;
}
FreshSpecification应该指定产品是否没有气味。为了做到这一点 - 它应该检查产品类型,找出产品新鲜的天数,并将其与 producedOn 进行比较.一种简单的。

但是问题来了 - productTypeValidityTermproductType应该由客户管理。他应该能够自由地添加/修改这些。因为我无法从产品遍历到 productTypeValidityTerm直接,我需要通过 productType 以某种方式查询它们.

以前 - 我会创建类似 ProductService 的东西它通过构造函数接收必要的存储库,查询术语,执行一些额外的巫术并返回 bool 值(使相关逻辑远离对象本身并将其分散谁知道在哪里)。

我认为做这样的事情可能是可以接受的:
addProduct(product, productTypeValidityTermRepository){...}

但是话又说回来-我无法自由地从多个规范中组合规范,这是它们的主要优势之一。

所以 - 问题是,在哪里做呢?商店如何才能知道条款?

最佳答案

有过度简化事情的风险:为什么不把 Product产品“知道”新鲜事物吗?一个 Store (或任何其他类型的相关对象)不必知道如何确定产品是否仍然新鲜;换句话说,像 freshSpecification 这样的事实或 productTypeValidityTerm Store 甚至不应该知道存在, 它应该简单地检查 Product.IsFresh (或者可能是其他更符合现实世界的名称,如 ShouldbeSoldByExpiresAfter 等)。然后产品可以知道如何实际检索 protductTypeValidityTerm通过注入(inject)存储库依赖项。

在我看来,您正在将行为外化,这应该是您的域聚合/实体所固有的,最终(再次)导致贫血的域模型。

当然,在更复杂的场景中,新鲜度取决于上下文(例如,在廉价商店中可接受的东西不值得在高级商店出售),您需要将整个行为外部化,包括产品和商店, 并创建一个完全不同的类型来模拟这个特定的行为。

在评论后添加

对于我提到的简单场景,沿着这些思路:制作 FreshSpec Product 聚合的一部分,它允许 ProductRepository (在这里注入(inject)构造函数)在需要时(懒惰地)加载它。

public class Product {
public ProductType ProductType { get; set; }
public DateTime ProducedOn { get; set; }
private FreshSpecification FreshSpecification { get; set; }
public Product(IProductRepository productRepository) { }

public bool IsFresh() {
return FreshSpecification
.IsSatisfiedBy(ProductType, ProducedOn);
}
}

商店不知道这些内部情况:它只关心产品是否新鲜:
public class Store {
private List<Product> Products = new List<Product>();
public void AddProduct(Product product) {
if (product.IsFresh()) {
Products.Add(product);
}
}
}

关于inversion-of-control - DDD,处理依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2226748/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com